JAX-WS& JSR 330(Spring) - 无法注入依赖

时间:2011-12-04 16:51:38

标签: dependency-injection jax-ws java-ee-6

我似乎无法将一个简单的bean注入我的@WebService。在类路径上定义了Spring并定义了javax.inject个依赖项后,我创建了一个简单的JAX-WS Web服务,其中包含一些底层接口驱动的DAO等:

@Named
@WebService(name = "NoteStorage", serviceName = "NoteStorageWS")
public class NoteStorageWS implements NoteStore {

    private static final Log l = LogFactory.getLog(NoteStorageWS.class);

    @Named("NoteDAO")
    @Inject
    private NoteDAO noteDAO;

    public NoteStorageWS() {
        super();
    }

    @Override
    @WebMethod
    public StorageState takeNote(String note) {
        try {
            l.info(format("Service received message: '%s'", note));

            Note n = new Note();
            n.setContent(note);
            noteDAO.store(n);

        } catch (Exception e) {
            l.error(e);
            return StorageState.FAILURE;
        }
        return StorageState.SUCCESS;
    }

    @WebMethod(exclude = true)
    public void setNoteDAO(NoteDAO noteDAO) {
        this.noteDAO = noteDAO;
    }
}

NoteDAO刚刚执行:FlatFileNoteDAO,其定义如下:

@Named("NoteDAO")
public class FlatFileNoteDAO implements NoteDAO {

    private static final Log l = LogFactory.getLog(FlatFileNoteDAO.class);

    @Override
    public void store(Note n) {
        if (n == null) {
            throw new IllegalArgumentException("Note was null");
        }

        try {
            l.info(format("Storing note '%s'", n));
            FileWriter fileWriter = new FileWriter(new File("Note"));
            fileWriter.write(format("%s\n", n.getContent()));
            fileWriter.close();
        } catch (IOException e) {
            throw new DataAccessException(e);
        }

    }

}

我的web.xml说:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/context.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <resource-env-ref>
        <description>Object factory for the CDI Bean Manager</description>
        <resource-env-ref-name>BeanManager</resource-env-ref-name>
        <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
    </resource-env-ref>
</web-app>

我将应用程序部署到目标/ note-ws /目录并将其部署到Glassfish,并通过takeNote页面执行简单的?Tester方法。

在提交测试表格后,我在第NullPointerException行得到noteDAO.store(n);,大概是因为没有注入noteDA。

我可以确认在上下文初始化(Java EE上下文)中来自glassfish的日志调用了Spring:

[#|2011-12-04T16:57:24.970+0000|INFO|glassfish3.1.1|org.springframework.context.annotation.ClassPathBeanDefinitionScanner|_ThreadID=256;_ThreadName=Thread-2;|JSR-330 'javax.inject.Named' annotation found and supported for component scanning|#]

    [#|2011-12-04T16:57:25.653+0000|INFO|glassfish3.1.1|org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor|_ThreadID=256;_ThreadName=Thread-2;|JSR-330 'javax.inject.Inject' annotation found and supported for autowiring|#]

    [#|2011-12-04T16:57:25.757+0000|INFO|glassfish3.1.1|org.springframework.beans.factory.support.DefaultListableBeanFactory|_ThreadID=256;_ThreadName=Thread-2;|Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@9e39146: defining beans [noteStorageWS,NoteDAO,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor]; root of factory hierarchy|#]

表示我的bean已定义:noteStorageWSNoteDAO等等。

有什么想法吗?

修改  澄清一下,我正在使用Spring提供JSR 330 - 依赖注入 - 功能。

3 个答案:

答案 0 :(得分:1)

我从来没有解决这个问题,所以我最终删除了DI功能,因为代码库很小并且依赖于手动依赖性解析 - 现在只需普通的new IFaceImpl();

答案 1 :(得分:0)

JAX-WS和Guice需要通过@GuiceManaged注释进行特定集成。更多信息here

答案 2 :(得分:0)

将业务逻辑移动到单独的bean并使用@Configurable注释它,以便Spring可以处理bean的生命周期。现在在NoteStorageWS中使用该bean

    @Configurable
    public class NoteStorageUtil{
       @Named("NoteDAO")
       @Inject
       private NoteDAO noteDAO;

       public StorageState takeNote(String note) {
         try {
                l.info(format("Service received message: '%s'", note));
                Note n = new Note();
                n.setContent(note);
                noteDAO.store(n);

          } catch (Exception e) {
                l.error(e);
                return StorageState.FAILURE;
          }
          return StorageState.SUCCESS;
       }
    }

    @WebService(name = "NoteStorage", serviceName = "NoteStorageWS")
    public class NoteStorageWS implements NoteStore {
        public StorageState takeNote(String note) {
            return new NoteStorageUtil().takeNote(note)
        }
    }

或者请检查您的端点配置是否正确,以便Web服务端点也是一个弹簧管理的bean。 例如: -

   <bean id="hello" class="demo.spring.service.HelloWorldImpl" />
   <jaxws:endpoint id="helloWorld" implementor="#hello" address="/HelloWorld" />

检查the link