Estoy luchando por esto durante un par de horas, pero no pude entender qué está mal con mi configuración ...

Actualmente, en TestController, el campo del motor está marcado con el error

"no se pudo conectar automáticamente. No se encontraron beans del tipo 'ServerEngine'".

Ya intenté reemplazar @SpringBootApplication con @Configuration, @EnableAutoConfiguration y @ComponentScan pero aún obtengo el error.

A continuación se encuentran los archivos relevantes:

Application.java

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applictionContext.xml");
        SpringApplication.run(Application.class, args);
    }
}

ServerEngine.java (actúa como el singleton del sistema principal)

public class ServerEngine {

    @Autowired
    private DataLayer dataLayer;
    public DataLayer getDal(){
        return dataLayer;
    }

    @Autowired
    private UsersDal usersDal;
    public UsersDal getUsersDal(){
        return usersDal;
    }

}

TestController.java

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    ServerEngine engine;

    @RequestMapping(value = "/users", method = RequestMethod.POST)
    public void test(HttpServletRequest request, HttpServletResponse response){    
        engine.getUsersDal().addOrUpdateUser(...);
    }
}

ApplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="serverEngine" class="partners.dataaccess.ServerEngine"/>

    <bean id="usersDal" class="partners.dataaccess.UsersDal"/>
    <bean id="dataLayer" class="partners.dal.DataLayer">
        <constructor-arg name="username" value="..."/>
        <constructor-arg name="password" value="..."/>
        <constructor-arg name="url" value="..."/>
    </bean>
</beans>
1
Gil Peretz 23 mar. 2017 a las 23:11

2 respuestas

La mejor respuesta

En main, estás instanciando un ApplicationContext applicationContext, pero luego no haces nada con él, no lo pasas al SpringApplication.

No estoy familiarizado con Spring Boot, pero tampoco veo ningún lugar en su código en el que el nombre de la configuración XML se asigne a SpringApplication. Por lo tanto, probablemente solo use la configuración de anotación.

Y finalmente, dado que ServerEngine no está anotado con @Service, no se instanciará como un bean Spring durante la exploración de componentes.

4
Jiri Tousek 23 mar. 2017 a las 20:21

La mejor y más fácil solución sería hacer anotaciones en las clases que está conectando automáticamente en su aplicación, como ServerEngine, UsersDal y DataLayer con la anotación @Service o @Component. Si hace eso, no tiene que crear explícitamente beans para ellos en configuraciones xml o java.

1
amaljoyc 23 mar. 2017 a las 20:55