0

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

如果我尝试通过显式调用 ApplicationContext-test.xml 来使用测试包中的服务(我使用 maven),它工作正常...... 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

4

1 回答 1

2

当不使用方面/代码编织时,您需要从 Springs 的 ApplicationContext 获取您的 bean(如果该对象已由 Spring 创建,则所有 @Autowired 字段都将被设置),因为 Spring 不知道您使用new. 使用 Spring 编写 Web 应用程序的常用方法是使用 DispatcherServlet 和控制器,而不是 Servlet,有关快速教程,请参见此处的示例。这背后的原因是 Spring 将负责创建所有 @Controller/@Service/etc 注释的类,毫不费力地自动装配标记的字段,处理将请求委托给正确的控制器方法等等。

但是,也可以在 Servlet 中获取应用程序上下文和 bean,但是代码不太干净,不容易测试,从长远来看可能会成为维护的噩梦。例如:

   WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
   MyBeanFromSpring myBean =(MyBeanFromSpring)springContext.getBean("myBeanFromSpring");
   //Do whatever with myBean...
于 2012-08-05T10:10:13.117 回答