2012-06-04 16 views
5

カスタムのcxfインターセプタに@Autowiredを使用すると、小さな問題に遭遇するようです。 私は、SOAPメッセージをログに記録し、AMQPを使って別のシステムに送信したいと考えています。このプロセスは通常のサービスなどのために機能します。 私が何をしても、必要なプロパティはautowiredにならず、nullのままです。Spring Autowiredをカスタムcxfインターセプタで使用する方法は?

私は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()); 
    } 

} 
+0

スプリングコンテナからの注射?注入に関する他の問題(@Valueパラメータでの失敗など)が報告されましたか? –

+0

このインターセプターの構成をCXFでも共有できますか?この問題の原因は、インターセプタがCXFによってインスタンス化され、別の自動インスタンスがSpringによって作成された可能性があるためです。 –

+0

私は上記のようにインターセプタを実装し、@ org.apache.cxf.interceptor.InInterceptors(インターセプタ= {"org.apache.cxf.interceptor.LoggingInInterceptor"、 "mypackagenames.ws.interceptor.LogInInterceptor "})私は追加の設定を全く行っていませんでした。 – Marco

答えて

7

あなたは@InInterceptors(CXF注釈)@Component(春の注釈)を混在させることはできません。これにより、インターセプタの2つのインスタンスが作成されます.1つは依存関係がSpringによってインジェクトされ、もう1つはCXFによって作成されます。 (CXFはすでに春のコンテキストでインスタンスを作成したことを知る方法がないので、あなたは、@InInterceptors注釈ではなく、豆のIDでクラス名を提供している。)

@InInterceptors注釈を削除すると、component scanに加えて、 :私はこれが古い質問ですけど、ジョナサンWの答えは、私を助け、私は追加したい

<jaxws:endpoint id="myWebService" address="/MyWebService"> 
    <jaxws:inInterceptors> 
     <ref bean="myInInterceptor" /> 
    </jaxws:inInterceptors> 
</jaxws:endpoint> 
+0

コンポーネントスキャンが成功しました。正しいパッケージ名はspring xmlファイルにあります。まだプロパティは注入されていません..他の手掛かり? – Marco

+0

はい。私はBijuへのあなたのフィードバックに基づいて私の答えを編集しました。 –

+0

その作業!明確な説明とこれを実装するのを助けてくれてありがとう。 – Marco

1

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

また、あなたのアプリケーションのコンテキストでこのようなものが必要それに。

これは春のブート1.3.1で動作するように私はカスタムインターセプタを得た方法であると@Autowired:「拾った」あなたはLogInInterceptorが発見されていることを意味し、対象であることで

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 
    } 

} 
関連する問題