Как использовать Spring Autowired в пользовательском перехватчике cxf?

Я, кажется, столкнулся с небольшой проблемой при использовании @Autowired в пользовательский перехватчик CXF. Мой пример использования - я хочу записывать мыльные сообщения и отправлять их с помощью AMQP в другую систему. Этот процесс работает для обычных служб и т. Д. Но что бы я ни делал, необходимые свойства не связываются автоматически и остаются нулевыми.

Я проверил журнал Spring DI, и контекст сканируется и подбирается, так что мне не хватает?

Возможно ли это даже в CXF перехватчиках?

@Component
public class LogInInterceptor extends AbstractSoapInterceptor {

    private @Value("#{rabbitMQProperties['rabbitmq.binding.log.soap']}")
    String binding;

    @Autowired
    AmqpTemplate amqpTemplate;

    public LogInInterceptor() {
        super(Phase.RECEIVE);
    }

    @Override
    public void handleMessage(SoapMessage soapMessage) throws Fault {
        logIt(soapMessage);
    }

    private void logIt(SoapMessage message) throws Fault {
        // rest of the code omitted...!!!     
        amqpTemplate.convertAndSend(binding, buffer.toString());
    }

}
 Marco05 июн. 2012 г., 08:35
Я реализовал перехватчик, как описано выше, и добавил его в свой веб-сервис через @ org.apache.cxf.interceptor.InInterceptors (interceptors = {& org.apache.cxf.interceptor.LoggingInInterceptor & quot;, mypackagenames.ws.interceptor. LogInInterceptor & quot;}) Я не выполнял никаких дополнительных настроек вообще.
 Jonathan W05 июн. 2012 г., 20:38
Марко, вот почему. CXF создает объект и использует его, а не Spring.
 Jonathan W04 июн. 2012 г., 23:27
"Подобрал" Вы имеете в виду, что ваш LogInInterceptor найден и подходит для инъекции из контейнера Spring? Сообщалось ли о каких-либо других проблемах с внедрением (например, сбой при параметре @Value)?
 Biju Kunjummen04 июн. 2012 г., 23:32
Не могли бы вы поделиться конфигурацией этого перехватчика с CXF? Причиной этой проблемы может быть то, что CXF мог создать экземпляр перехватчика, а Spring мог создать отдельный экземпляр с автоматическим подключением.

Ответы на вопрос(2)

что это старый вопрос, но ответ Джонатана У. помог мне, и я хотел бы добавить к нему.

Вот как я получил пользовательские перехватчики и@Autowired работать с Spring Boot 1.3.1:

http://cxf.apache.org/docs/jax-ws-configuration.html

import java.util.Arrays;

import javax.jws.WebService;

import org.apache.cxf.Bus;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@EnableAutoConfiguration
@ImportResource({ "classpath:META-INF/cxf/cxf.xml" })
public class Application extends SpringBootServletInitializer {

    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private MyInterceptor myInterceptor;

    @Autowired
    private HelloWorldImpl helloWorldImpl;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    // Replaces the need for web.xml
    @Bean
    public ServletRegistrationBean servletRegistrationBean(ApplicationContext context) {
        return new ServletRegistrationBean(new CXFServlet(), "/api/*");
    }

    // Replaces cxf-servlet.xml
    @Bean
    // <jaxws:endpoint id="helloWorld" implementor="demo.spring.service.HelloWorldImpl" address="/HelloWorld"/>
    public EndpointImpl helloService() {
        Bus bus = (Bus) applicationContext.getBean(Bus.DEFAULT_BUS_ID);
        EndpointImpl endpoint = new EndpointImpl(bus, helloWorldImpl);

        // Set interceptors here
        endpoint.setInInterceptors(Arrays.asList(myInterceptor));

        endpoint.publish("/hello");
        return endpoint;
    }


    // Used when deploying to a standalone servlet container, i.e. tomcat
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    // Web service endpoint
    @WebService(endpointInterface = "demo.spring.service.HelloWorld")
    //@InInterceptors not defined here
    public static class HelloWorldImpl {

    }

    public static class MyInterceptor extends LoggingInInterceptor {
      // @Autowired works here
    }

}
Решение Вопроса

@InInterceptors (аннотация CXF)and @Component (весенняя аннотация). Это создаст два отдельных экземпляра вашего перехватчика: тот, чьи зависимости вводятся Spring, и тот, который создается CXF. (Вы предоставляете имена классов в@InInterceptors аннотация, а не идентификатор компонента, поэтому CXF не может знать, что вы уже создали экземпляр в контексте Spring.)

Удалить@InInterceptors аннотации и, в дополнение ккомпонентное сканирование:

<context:component-scan base-package="org.example.config"/>

Вам также нужно что-то подобное в контексте вашего приложения:

<jaxws:endpoint id="myWebService" address="/MyWebService">
    <jaxws:inInterceptors>
        <ref bean="myInInterceptor" />
    </jaxws:inInterceptors>
</jaxws:endpoint>
 Marco07 июн. 2012 г., 17:18
Работает! Спасибо за четкое объяснение и помощь в реализации этого.
 Marco05 июн. 2012 г., 07:18
Сканирование компонента прошло успешно, правильное имя пакета находится в весеннем XML-файле. Все же свойства не вводятся. Любая другая подсказка?
 05 июн. 2012 г., 20:50
Да. Я отредактировал свой ответ, основываясь на ваших отзывах в Biju.

Ваш ответ на вопрос