在Spring中使用@Autowired的NullPointerException

时间:2012-08-05 09:44:48

标签: spring autowired applicationcontext

我尝试使用带有@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。

1 个答案:

答案 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...