JBoss 6 + Spring 3.0.5 + JAX-WS / CXF - PullRequest
       21

JBoss 6 + Spring 3.0.5 + JAX-WS / CXF

2 голосов
/ 18 марта 2011

Наш проект работает на JBoss 6 с Spring 3.0.5. Все шло гладко, пока мы не попытались реализовать некоторые веб-сервисы с помощью JAX-WS. Если я попытаюсь сделать несколько простых WS (например, добавить 2 числа), это просто сработает - я добавлю аннотации и добавлю аннотированный класс в качестве сервлета. Но все становится сложнее, если я пытаюсь заполнить свои классы JAX-WS зависимостями.

Вот мой код:

@WebService(name = "principal")
public class PrincipalWebService extends SpringBeanAutowiringSupport {

    @Autowired
    private PrincipalManager manager;

    @WebMethod
    public int add(int a, int b) {
        return a + b;
    }

    @WebMethod
    public Principal getById(int i) {
            return manager.getById(i);
    }

}

Метод Add работает, но getById не работает с NPE. Я отлаживал SpringBeanAutowiringSupport, и похоже, что ContextLoader.getCurrentWebApplicationContext () возвращает ноль. Это означает, что конструктор SpringBeanAutowiringSupport вызывается до инициализации контекста.

Я пытался следовать инструкциям CXF при запуске приложения с помощью Spring . У меня сейчас нет этого кода, но я зарегистрировал PrincipalWebService в качестве компонента, создал файл Spring для настройки CXF и добавил этот компонент через его идентификатор в качестве конечной точки. На Jetty все прошло хорошо, но на JBoss не получилось. Я получал различные виды исключений в зависимости от того, как я настраиваю CXF, но основная причина была та же - версия JBoss 6 CXF скомпилирована для Spring 2.5, поэтому у нас была несовместимость библиотек.

Есть ли у кого-нибудь идеи заставить IoC работать для служб Jax-ws на JBoss 6?

Ответы [ 3 ]

9 голосов
/ 18 марта 2011

Хорошо, я нашел обходной путь.Все, что нам нужно сделать, это переместить внедрение зависимостей в метод @PostConstruct:

@PostConstruct
public void init() {
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
2 голосов
/ 18 марта 2011

Вы должны зарегистрировать свою конечную точку в контексте Spring, используя jaxws: endpoint, и обратиться к своему компоненту с помощью атрибута Implementor.Например:

<jaxws:endpoint id="NotificationImpl"
                implementorClass="com.foo.ws.notification.NotificationImpl"
                implementor="#notificationImpl"
                serviceName="notification:Notification"
                address="/notification"
                xmlns:notification="http://notification.ws.foo.com">

Конечная реализация:

@Component("notificationImpl")
@WebService(endpointInterface="com.foo.ws.notification.Notification")
public class NotificationImpl implements Notification  {

  @Autowired MessagingService messagingService = null;

  //...
}
0 голосов
/ 24 мая 2013

У меня такая же проблема, но в WebLogic я решил ее, как описано здесь https://jira.springsource.org/browse/SPR-5652.

...