JAX-WS & JSR 330 (Spring) - не может ввести зависимость - PullRequest
3 голосов
/ 04 декабря 2011

Кажется, я не могу добавить простой боб в @WebService. С помощью Spring на определенных classpath и javax.inject зависимостях я создал простой веб-сервис JAX-WS с некоторыми базовыми управляемыми интерфейсом 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>

Я развертываю приложение в Glassfish, указывая его в каталог target / note-ws / и выполняю простой метод takeNote на странице ?Tester.

При отправке формы для тестирования я получаю NullPointerException в строке noteDAO.store(n);, предположительно потому, что noteDAO не вводили.

Я могу подтвердить, что Spring был вызван журналами из Glassfish при инициализации контекста (контекст Java EE):

[#|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|#]

, который говорит, что мои бобы определены: noteStorageWS, NoteDAO и т. Д.

Есть идеи?

Редактировать чтобы уточнить, я использую Spring для обеспечения JSR 330 - внедрение зависимостей - функциональность.

Ответы [ 3 ]

1 голос
/ 07 января 2012

Я так и не смог решить эту проблему, поэтому в итоге я удалил DI-функции, так как база кода была маленькой и полагалась на ручное разрешение зависимостей - пока просто старый new IFaceImpl();.

0 голосов
/ 05 сентября 2012

Переместите бизнес-логику в отдельный компонент и аннотируйте ее с помощью @Configurable, чтобы Spring мог обрабатывать жизненный цикл компонента.Теперь используйте этот компонент в NoteStorageWS

    @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)
        }
    }

Или проверьте правильность конфигурации конечной точки, чтобы конечная точка веб-службы также была компонентом с пружинным управлением.Например: -

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

чек ссылка

0 голосов
/ 04 декабря 2011

JAX-WS и Guice требуют специальной интеграции через аннотацию @GuiceManaged.Подробнее здесь .

...