【问题标题】:JAX-WS & JSR 330 (Spring) - cannot inject dependencyJAX-WS & JSR 330 (Spring) - 不能注入依赖
【发布时间】:2011-12-04 16:51:38
【问题描述】:

我似乎无法将一个简单的 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>

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

提交测试表单后,我在noteDAO.store(n); 行收到NullPointerException,可能是因为没有注入noteDAO。

我可以确认 Glassfish 在上下文初始化(Java EE 上下文)中的日志已经调用了 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 -- 依赖注入 -- 功能。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我没有使用 Guice -- 你是说我应该使用还是需要额外使用?
      • 您使用的是哪种 JSR-330 实现?
      • Spring,如原帖所述:“Spring on the classpath”
      • 我刚刚了解到 Spring 实现了 JSR-330 :) 我的印象是创建了两个不同的 NoteStorageWS 实例。一个来自 Spring,它实际上具有注入的 DAO,另一个来自 Glassfish 容器,作为 WebService 注释的结果(这是调用 WS 时使用的那个),但这只是一个想法。可以尝试在放置服务的jar 的META-INF 目录中放置一个空的beans.xml 文件吗?这将告诉 glassfish 你的包中有托管 bean,尽管它们不会由 Spring 管理。
      • 一个空的 beans.xml 已经存在。我试图通过删除 Spring 导入来简化这一切,但没有运气:|
      【解决方案3】:

      将业务逻辑移动到单独的 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 服务端点也是 spring 管理的 bean。 例如:-

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

      查看the link

      【讨论】:

        猜你喜欢
        • 2013-08-06
        • 2013-04-23
        • 2017-03-28
        • 2011-02-12
        • 2013-06-09
        • 2012-07-04
        • 1970-01-01
        • 2018-07-24
        • 2011-05-19
        相关资源
        最近更新 更多