org.springframework.beans.factory.NoSuchBeanDefinitionException:未定义名为 'userDAO' 的 bean - 未传递上下文
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userDAO' is defined - context not being passed
这是我的文件和目录:
Spring-Module.xml
<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-2.5.xsd">
<import resource="Spring-Datasource.xml" />
<import resource="Spring-User.xml" />
Spring-Datasource.xml
<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-2.5.xsd">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="VALID_URL" />
<property name="username" value="USER" />
<property name="password" value="PASS" />
</bean>
Spring-User.xml
<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-2.5.xsd">
<bean id="userDAO" class="hello.JdbcUserDAO">
<property name="dataSource" ref="dataSource" />
</bean>
Application.java
package hello;
<import statements>
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Spring-Module.xml");
SpringApplication.run(Application.class, args);
UserDAO userDAO = (UserDAO) context.getBean("userDAO");
}
}
RegistrationController.java
package hello;
@RestController
public class RegistrationController implements ApplicationContextAware {
private static final String template = "Hello, %s!";
// @Autowired <-- using this instead of interface doesn't work either
private static ApplicationContext context;
private final AtomicLong counter = new AtomicLong();
@RequestMapping(value = "/api/register", method = RequestMethod.POST)
public Response registerUser(@RequestParam Map<String,String> req) {
User user = new User(counter.incrementAndGet(),
req.get("first"), req.get("last"), req.get("email"),
req.get("age"), Double.parseDouble(req.get("height")),
Double.parseDouble(req.get("weight")), Double.parseDouble(req.get("bmi"))
);
UserDAO userDAO = (UserDAO) context.getBean("userDAO"); // <--- error here
userDAO.insert(user);
return new Response(counter.get(), "200");
}
public static ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
this.context = ac;
}
}
当我从应用程序 class 访问 bean userDAO 时,一切都按预期正常运行。问题是当我尝试使用上下文从我的路由 class 访问 userDAO 时,它抛出错误 'bean userDAO not found'。因此我怀疑必须在我的路线内再次创建上下文?
我对 Spring 比较陌生,完全被难住了!我会尽力澄清你们的任何问题。
编辑:添加目录
src/main/java/hello
/resources
/Spring-User.xml
/Spring-Module.xml
/Spring-Datasource.xml
我找到了解决方案 - 感谢您的帮助。我不确定为什么会这样(或者更确切地说,为什么实现接口不起作用)。
RegistrationController.java
package hello;
@RestController
public class RegistrationController implements ApplicationContextAware {
@Autowired
private static ApplicationContext context;
@RequestMapping(value = "/api/register", method = RequestMethod.POST)
public Response registerUser(@RequestParam Map<String,String> req) {
context = new ClassPathXmlApplicationContext("Spring-Module.xml"); // <--- added this line
User user = new User(counter.incrementAndGet(),
req.get("first"), req.get("last"), req.get("email"),
req.get("age"), Double.parseDouble(req.get("height")),
Double.parseDouble(req.get("weight")), Double.parseDouble(req.get("bmi"))
);
UserDAO userDAO = (UserDAO) context.getBean("userDAO");
userDAO.insert(user);
return new Response(counter.get(), "200");
}
public static ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
this.context = ac;
}
}
您实际上需要为带注释的组件设置类路径扫描并打开注释配置
<context:annotation-config/>
<context:component-scan base-package="com.example.dao, com.example.service, com.example.controller, etc..."/>
但 2016 年最好的建议是完全忘记 xml 配置并开始使用 java 配置。
这是我的文件和目录:
Spring-Module.xml
<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-2.5.xsd">
<import resource="Spring-Datasource.xml" />
<import resource="Spring-User.xml" />
Spring-Datasource.xml
<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-2.5.xsd">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="VALID_URL" />
<property name="username" value="USER" />
<property name="password" value="PASS" />
</bean>
Spring-User.xml
<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-2.5.xsd">
<bean id="userDAO" class="hello.JdbcUserDAO">
<property name="dataSource" ref="dataSource" />
</bean>
Application.java
package hello;
<import statements>
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Spring-Module.xml");
SpringApplication.run(Application.class, args);
UserDAO userDAO = (UserDAO) context.getBean("userDAO");
}
}
RegistrationController.java
package hello;
@RestController
public class RegistrationController implements ApplicationContextAware {
private static final String template = "Hello, %s!";
// @Autowired <-- using this instead of interface doesn't work either
private static ApplicationContext context;
private final AtomicLong counter = new AtomicLong();
@RequestMapping(value = "/api/register", method = RequestMethod.POST)
public Response registerUser(@RequestParam Map<String,String> req) {
User user = new User(counter.incrementAndGet(),
req.get("first"), req.get("last"), req.get("email"),
req.get("age"), Double.parseDouble(req.get("height")),
Double.parseDouble(req.get("weight")), Double.parseDouble(req.get("bmi"))
);
UserDAO userDAO = (UserDAO) context.getBean("userDAO"); // <--- error here
userDAO.insert(user);
return new Response(counter.get(), "200");
}
public static ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
this.context = ac;
}
}
当我从应用程序 class 访问 bean userDAO 时,一切都按预期正常运行。问题是当我尝试使用上下文从我的路由 class 访问 userDAO 时,它抛出错误 'bean userDAO not found'。因此我怀疑必须在我的路线内再次创建上下文?
我对 Spring 比较陌生,完全被难住了!我会尽力澄清你们的任何问题。
编辑:添加目录
src/main/java/hello
/resources
/Spring-User.xml
/Spring-Module.xml
/Spring-Datasource.xml
我找到了解决方案 - 感谢您的帮助。我不确定为什么会这样(或者更确切地说,为什么实现接口不起作用)。
RegistrationController.java
package hello;
@RestController
public class RegistrationController implements ApplicationContextAware {
@Autowired
private static ApplicationContext context;
@RequestMapping(value = "/api/register", method = RequestMethod.POST)
public Response registerUser(@RequestParam Map<String,String> req) {
context = new ClassPathXmlApplicationContext("Spring-Module.xml"); // <--- added this line
User user = new User(counter.incrementAndGet(),
req.get("first"), req.get("last"), req.get("email"),
req.get("age"), Double.parseDouble(req.get("height")),
Double.parseDouble(req.get("weight")), Double.parseDouble(req.get("bmi"))
);
UserDAO userDAO = (UserDAO) context.getBean("userDAO");
userDAO.insert(user);
return new Response(counter.get(), "200");
}
public static ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
this.context = ac;
}
}
您实际上需要为带注释的组件设置类路径扫描并打开注释配置
<context:annotation-config/>
<context:component-scan base-package="com.example.dao, com.example.service, com.example.controller, etc..."/>
但 2016 年最好的建议是完全忘记 xml 配置并开始使用 java 配置。