我尝试使用带有@Autowired批注的Spring框架来获取Service类。
这里我的类(此类由 WebSocketServlet 调用)需要使用服务(我在调用时获得NullPointerException ):
public class SignupWebSocketConnection extends MessageInbound {
private static final Logger log = LoggerFactory.getLogger(SignupWebSocketConnection.class);
@Autowired
private UserService userService;
@Override
protected void onOpen(WsOutbound outbound) {
log.info("Connection done");
}
@Override
protected void onClose(int status) {
log.info("Connection close");
}
@Override
protected void onBinaryMessage(ByteBuffer byteBuffer) throws IOException {
log.warn("Binary message are not supported");
throw new UnsupportedOperationException("Binary message are not supported");
}
@Override
protected void onTextMessage(CharBuffer charBuffer) throws IOException {
User userTest = new User("log", "pass", "ema");
userService.create(userTest);
}
}
这是我的web.xml:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这是我的ApplicationContext.xml:
<bean id="userService" class="service.UserService">
如果我尝试在测试包中使用Service(我使用maven)并显式调用ApplicationContext-test.xml,那么它的工作正常...... ApplicationContext.xml和ApplicationContext- test.xml是相同的(只是对数据库更改的参数)
感谢所有人:D
编辑:
我在ressources文件夹中取消我的applicationContext.xml并创建一个要测试的类:
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) ctx.getBean("userService");
User user = new User("log","pas","emai");
userService.create(user);
}
调用userService.create()... 时也会出现NullPointerException。
答案 0 :(得分:2)
当不使用方面/代码编织时,你需要从Springs的ApplicationContext中获取bean(如果该对象已经由Spring创建,所有@Autowired字段将被设置),因为Spring不知道你创建new
的对象。使用Spring编写Web应用程序的常用方法是使用DispatcherServlet和Controllers,而不是Servlet,以获得快速教程,例如here。这背后的原因是Spring将负责创建所有@Controller / @Service / etc-annotated类,自动装配标记字段,处理委托请求以纠正控制器方法等等。
但是,也可以在Servlet中获取应用程序上下文和bean,但是代码不那么干净,不太容易测试,并且可能成为长期维护的噩梦。例如:
WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
MyBeanFromSpring myBean =(MyBeanFromSpring)springContext.getBean("myBeanFromSpring");
//Do whatever with myBean...