2017-03-29 9 views
1

私は、Spring Webアプリケーションを公開するためにそのアプリケーションを使用しているSpring起動アプリケーションを開発中です。私は春のブートアプリケーションでSOAP implのApache CFXフレームワークを使用しています。私はアノテーションベースのアプローチを使用しています。Spring起動アプリケーションでアプリケーションコンテキストを読み込めません

私はBeanのいずれかのSpring起動設定ファイルからApplication Contextを設定する際に問題に直面しています。以下は私のコードです。

@SpringBootApplication 
@ComponentScan("com.test") 
public class Application { 

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

コンフィギュレーションファイルは次のとおりです。

@Configuration 
public class WebServiceConfiguration { 

//All individual bean definitions should go here 
@Autowired 
ApplicationContext appContext; 

@Bean 
public ServletRegistrationBean cxfServlet() { 
    return new ServletRegistrationBean(new CXFServlet(), "/soap-api/*"); 
} 

@Bean(name = Bus.DEFAULT_BUS_ID) 
public SpringBus springBus() { 
    return new SpringBus(); 
} 


@Bean(name="IValidator") 
public IValidator getValidator(){ 
    return new Validator(); 
} 

@Bean(name="SOAPprocessImpl") 
public IPSoap getService() { 
    return new SOAPprocessImpl(); 
} 

@Bean 
public Endpoint endpoint() { 
    EndpointImpl endpoint = new EndpointImpl(springBus(), getService()); 
    endpoint.publish("/WS_1.0"); 
    endpoint.setWsdlLocation("process.wsdl"); 
    return endpoint; 
} 

は今、私は私がバリBeanに扱う得ることができるようにアプリケーション・コンテキストを取得する必要のある豆SOAPprocessImplの実装を持っています。私は、コンフィグレーション・ファイルの中でSOAPprocessImplをBeanとして宣言しました。コードは

@javax.jws.WebService (endpointInterface="com.test.IPSoap") 
public class SOAPprocessImpl implements IPSoap, ApplicationContextAware { 

private static ApplicationContext context; 

public static ApplicationContext getApplicationContext() { 
    return context; 
} 

@Override 
public void setApplicationContext(ApplicationContext ac) 
     throws BeansException { 
    context = ac; 
} 

private static final Logger logger = Logger.getLogger(SOAPprocessImpl.class.getName()); 

private IValidator validator = (IValidator) context.getBean("IValidator"); // context is NULL here 

public IRResponse GetBalance(TSSearchParams SearchParams) { 

    // Some processing logic 
    } 

}

以下のような問題は、私が埋め込まれたTomcatにデプロイすることにより、ブートアプリケーションの実行時にアプリケーション・コンテキストをさえ実装後SOAPprocessImplクラスに設定された取得されていないということですApplicationContextAware。私はAutowiringも試しましたが、それもうまくいきません。

私は奇妙なことに、すべてのBeanが定義されているConfigurationファイルでApplicationContextを取得できるかどうかを確認しようとしました。ここでは適切に設定されています。

この問題の解決方法を教えてもらえますか?私はSpring Bootの初心者であり、いくつかの設定を見逃している可能性があります。前もって感謝します。

答えて

2

オプション(1):問題を修正するには、以下に示すようにApplicationContextオブジェクトを注入することができるようにSpringコンテナにごSOAPprocessImpl Beanを登録するには@Configurationを使用する必要があります。

@Configuration 
@javax.jws.WebService (endpointInterface="com.test.IPSoap") 
public class SOAPprocessImpl implements IPSoap, ApplicationContextAware { 

    private static ApplicationContext context; 

    private IValidator validator; 

    public static ApplicationContext getApplicationContext() { 
    return context; 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext ac) 
     throws BeansException { 
     SOAPprocessImpl.context = ac; 
    } 


    @PostConstruct//use PostConstruct 
    public void init() { 
    validator = (IValidator) context.getBean("IValidator"); 
    } 


    //add your current code 
} 

重要な点は、コンテナによってBeanが準備されるまでcontextオブジェクトを使用できないため、変数を初期化するために上記のように@PostConstructメソッドを使用する必要があることです。

オプション2(推奨): 最善のアプローチは、あなたがApplicationContextAwareを認識するためにあなたのSOAPprocessImpl Beanを必要としないように、下図のようにあなたがSOAPprocessImplIValidatorオブジェクトを注入する@Autowiredを使用することができるということです。 SpringコンテナはIValidatorクラス用に提供された実装のインスタンスを挿入します(ただし、パッケージが@Componentscanの場合)。

@Component 
@javax.jws.WebService (endpointInterface="com.test.IPSoap") 
public class SOAPprocessImpl implements IPSoap { 

    private static final Logger logger = Logger.getLogger(SOAPprocessImpl.class.getName()); 


    @Autowired //spring directly injects this object 
    private IValidator validator; 

    public IRResponse GetBalance(TSSearchParams SearchParams) { 
     // Some processing logic 
    } 
} 
+0

ありがとうございました。私はあなたのアプローチを試みましたが、それでも動作しません。コンテキストはまだnullです。 – vikeng21

+0

'SOAPprocessImpl'パッケージはどのパッケージにありますか? – developer

+0

SOAPprocessImplは別のパッケージにあります。 com.test.configとWebServiceConfigurationは他のパッケージにあります。 com.test.ws – vikeng21

関連する問題