Busqué si debería anotar POJO con @Component o no. Parece que se recomienda no anotar pojo.

Esta es mi clase de configuración Mnemónico de estado de pedido que lee un archivo de texto:

@Configuration
public class OrderStatusMnemonic {
    private static final Logger log = LoggerFactory.getLogger("OrderStatusMnemonic.class");
    
    private ResourceLoader resourceLoader;
    
    @Autowired
    public OrderStatus orderStatus;

    public OrderStatusMnemonic(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }
    
    @PostConstruct
    public void init() {
        try {
            log.info("Loading order-status-mnemonic file ");
            Resource resource = resourceLoader.getResource("classpath:order-status-mnemonic.txt");
            InputStream inputStream = resource.getInputStream();
            
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            
            String str;
            List<String> orderStatusMnemonicList = new ArrayList<>();
            while ( (str = bufferedReader.readLine()) != null) {
                log.info("str = " + str);
                            
                orderStatusMnemonicList.add(str);
            }
            
            orderStatus.setValues(orderStatusMnemonicList);
            
            log.info("orderStatusMnemonicList = " + orderStatusMnemonicList.toString());
            
            
        } catch (IOException | NullPointerException e) {
            log.error("Failing to Load order status mnemonic file" + e.getMessage(), e);
        }
    }
        
}

OrderStatus POJO:

@Getter
@Setter
@ToString
public class OrderStatus {
    private List<String> values;
}

Como estoy conectando automáticamente la clase OrderStatus POJO, recibo un error:

Considere definir un bean de tipo 'com.spectrum.sci.osm.orderstatus.OrderStatus' en su configuración.

0
Bandita Pradhan 6 ago. 2020 a las 20:40

2 respuestas

La mejor respuesta

Su OrderStatus tal como está ahora no necesita anotación @Component por lo que no debe agregarlo. Además, no debe intentar @Autowire en ningún lugar sin @Component.

Seguramente puede agregar @Component y luego @Autowire en cualquier lugar que lo necesite, pero no tiene sentido ya que puede crear una instancia más fácil de su POJO con solo emitir new OrderStatus(). Y también podría ser una pérdida de recursos.

Entonces, ¿cuándo necesitas esas dos anotaciones? Siempre que su POJO necesite convertirse en un bean administrado. En otras palabras, cuando es necesario que Spring haga algunas cosas automágicas. Considere que su POJO tendría algo más complejo, como (verifique los comentarios):

// Enables autowiring OrderStatus -> autowired OrderStatus is managed 
// by Spring
@Component 
public class OrderStatus {
    private List<String> values;
    // Then there is something to autowire to OrderStatus also
    // Without OrderStatus being managed by Spring this would be ignored!
    // But because managed, Spring autowires also this one
    // Of course SomeOtherManagedBean must be a @Component, for example
    @Autowired
    private SomeOtherManagedBean somb;
}
1
pirho 6 ago. 2020 a las 19:16

@Component o @Autowired solo deben usarse para clases administradas por Spring. Los POJO no son administrados por Spring. Por lo tanto, no debe agregar @component ni debe conectarlo automáticamente. Dado que está intentando conectar automáticamente la clase POJO, está obteniendo un error al definir un bean de tipo OrderStatus

1
Sridhar Patnaik 6 ago. 2020 a las 18:00