9

Spring(Autowired)を使用して別のクラスを注入するRESTfulサービス(JBossでCXFを使用)を作成しています。しかし、クラスは注入されておらず、nullです。

Webサービスのインターフェースとクラス(インジェクションが必要な場所)

package com.company.project.web;

@Path("/myws")
public interface IMyWebService {    
   @POST
   @Path("/doSomething")    
   @Consumes("application/json")
   @Produces("application/json")
    MyResponse doSomething(MyRequest myRequest)
}

@Service("myWebService")
public class MyWebService implements IMyWebService {    
    @Autowired
    private IMyCore myCore;

    public MyResponse doSomething(MyRequest myRequest) {
      ....
    }
}

注入しなければならないもの

package com.company.project.biz;

public interface IMyCore {
   MyResponse doSomething(MyRequest myRequest);
}

@Component("myCore")
public class MyCore implements IMyCore {
    public MyResponse doSomething(MyRequest myRequest) {
            .....
    }
}

Beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xmlns:jaxrs="http://cxf.apache.org/jaxrs"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd    
    http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-http.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />

    <context:annotation-config />
    <context:component-scan base-package="com.company.project"/>    

    <jaxrs:server id="myWebService" address="/">
        <jaxrs:serviceBeans>
            <bean class="com.company.project.web.MyWebService" />
        </jaxrs:serviceBeans>
        <jaxrs:extensionMappings>
            <entry key="json" value="application/json" />
        </jaxrs:extensionMappings>
    </jaxrs:server>
</beans>

私のサービスはアクティブです(http:// localhost:8080 / {warname} / myws / doSomething)が、MyCoreインスタンスが(myCoreフィールドの)MyWebServiceに挿入されていません。これは常にnullであり、私のサービスは期待どおりに機能せず、代わりにNullPointerExceptionをスローします

グーグルで収集したすべての入力を試しました。運が悪い!あなたの助けは大歓迎です。

よろしく

4

3 に答える 3

8

以下のメソッドを Web サービスに追加してみてください。

@PostConstruct
public void init() {
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}

現在の Web アプリケーション コンテキスト (通常は ContextLoaderListener によってロードされるコンテキスト) が自動配線に使用されるため、IMyCore Bean は Web サービスではなく、コンテキスト リスナー構成ファイルで定義する必要があります。

于 2012-07-23T10:52:11.643 に答える
5

CXF Web Service クラスで Spring Beans を使用する場合は、CXF の XML 構成ファイル (例: spring-cxf.xml) で WebService を次のように宣言します。

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

WebService クラスの分離 Bean を宣言し、ID を使用してエンドポイントに配置します。このように、AutoWired アノテーションも使用できる Spring マネージド Bean が作成されます。

Web サービスを次のように宣言すると、Bean が自動的に注入されることはありません。

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<jaxws:endpoint id="helloWorld" implementor="demo.spring.service.HelloWorldImpl" address="/HelloWorld"/>

この場合、次のいずれかが必要になります。

  • 春豆を手動で注入する

    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

  • または、Spring コンテキストから Bean を 1 つずつ取得します

    ApplicationContext context = ...; // your Spring ApplicationContext HelloBean helloBean = (HelloBean) context.getBean("bean");

    JAX-RS でこれを試したことはありませんが、私の意見ではアプローチは同じはずです。

    CXF 公式ドキュメントより。

于 2014-10-20T14:07:38.053 に答える
1

Beans.xml で以下の Bean 構成を追加してみてください

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

私の場合、うまくいきました..

于 2012-05-07T00:50:44.420 に答える