0

Java 1.7 Spring 3.1.1 with Spring-WS 2.1.1 Joda Hibernate 3.6 MySQL 5.0.57 Maven 3 Tomcat 7 Eclipse 3.7

これで、SOAP Web サービスが稼働しています。

そして、私のスタンドアロン Java アプリはそれにアクセスできます。

現在、Spring MVC Web クライアントを構築してアクセスしようとしています。したがって、私の考え方では、標準の webapp のサービス レイヤーを web service endpoint に置き換えることができます。

このhttp://ankeetmaini.wordpress.com/2013/03/04/jax-ws-client-using-the-jax-ws-webserviceの後のパターン 化は、彼の命名規則をより標準的なものに切り替えた後、私が巻き上げたものです

FormsEndpointImplService

@WebServiceClient(name = "FormsEndpointImplService", 
                  wsdlLocation = "http://localhost:8080/dept_forms_webservice/formsService?wsdl",
                  targetNamespace = "http://endpoint.web.forms.azdeq.gov/") 
public class FormsEndpointImplService extends Service
{
    public final static URL WSDL_LOCATION;

    public final static QName SERVICE = new QName("http://endpoint.web.forms.azdeq.gov/", "FormsEndpointImplService");
    public final static QName FormsEndpointImplPort = new QName("http://endpoint.web.forms.azdeq.gov/", "FormsEndpointImplPort");
    static {
        URL url = null;
        try {
            url = new URL("http://localhost:8080/dept_forms_webservice/formsService?wsdl");
        } catch (MalformedURLException e) {
            java.util.logging.Logger.getLogger(FormsEndpointImplService.class.getName())
                .log(java.util.logging.Level.INFO, 
                     "Can not initialize the default wsdl from {0}", "http://localhost:8080/dept_forms_webservice/formsService?wsdl");
        }
        WSDL_LOCATION = url;
    }

    public FormsEndpointImplService(URL wsdlLocation) {
        super(wsdlLocation, SERVICE);
    }

    public FormsEndpointImplService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public FormsEndpointImplService() {
        super(WSDL_LOCATION, SERVICE);
    }

    //This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2
    //API jar or re-run wsdl2java with "-frontend jaxws21" to generate JAX-WS 2.1
    //compliant code instead.
    public FormsEndpointImplService(WebServiceFeature ... features) {
        super(WSDL_LOCATION, SERVICE, features);
    }

    //This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2
    //API jar or re-run wsdl2java with "-frontend jaxws21" to generate JAX-WS 2.1
    //compliant code instead.
    public FormsEndpointImplService(URL wsdlLocation, WebServiceFeature ... features) {
        super(wsdlLocation, SERVICE, features);
    }

    //This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2
    //API jar or re-run wsdl2java with "-frontend jaxws21" to generate JAX-WS 2.1
    //compliant code instead.
    public FormsEndpointImplService(URL wsdlLocation, QName serviceName, WebServiceFeature ... features) {
        super(wsdlLocation, serviceName, features);
    }

    /**
     *
     * @return
     *     returns FormsEndpoint
     */
    @WebEndpoint(name = "FormsEndpointImplPort")
    public FormsEndpoint getFormsEndpointImplPort() {
        return super.getPort(FormsEndpointImplPort, FormsEndpoint.class);
    }

    /**
     * 
     * @param features
     *     A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.  Supported features not in the <code>features</code> parameter will have their default values.
     * @return
     *     returns FormsEndpoint
     */
    @WebEndpoint(name = "FormsEndpointImplPort")
    public FormsEndpoint getFormsEndpointImplPort(WebServiceFeature... features) {
        return super.getPort(FormsEndpointImplPort, FormsEndpoint.class, features);
    }
}

FormsEndpoint (SEI)

@WebService(targetNamespace = "http://endpoint.web.forms.azdeq.gov/", name = "FormsEndpoint")
@XmlSeeAlso({ObjectFactory.class})
public interface FormsEndpoint
{
    @RequestWrapper(localName = "insertCompletedForm", targetNamespace = "http://endpoint.web.forms.azdeq.gov/", className = "gov.azdeq.forms.web.endpoint.InsertCompletedForm")
    @WebMethod
    @ResponseWrapper(localName = "insertCompletedFormResponse", targetNamespace = "http://endpoint.web.forms.azdeq.gov/", className = "gov.azdeq.forms.web.endpoint.InsertCompletedFormResponse")
    public void insertCompletedForm(
        @WebParam(name = "arg0", targetNamespace = "")
        gov.azdeq.forms.web.endpoint.CompletedForm arg0
    );
....    

}

と私の servlet-context.xml

...
<bean id="formsWebServiceProxy" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
    <property name="wsdlDocumentUrl"  value="http://localhost:8080/dept_forms_webservice/formsService?wsdl"/>
    <property name="serviceInterface" value="gov.azdeq.forms.web.endpoint.FormsEndpoint"/>
    <property name="serviceName"      value="FormsEndpointImplService"/>
    <property name="portName"         value="FormsEndpointImplPort"/>
    <property name="namespaceUri"     value="http://endpoint.web.forms.azdeq.gov/"/>
    <!-- <property name="endpointAddress" value="http://endpoint.web.forms.azdeq.gov/" />   -->
</bean>

<bean id="baseController"             class="gov.azdeq.forms.web.controller.BaseController">
  <property name="service"            ref="formsWebServiceProxy" />
</bean>

...

およびベースコントローラー

@RequestMapping
@Controller
public class BaseController
{
    private static final Logger logger = Logger.getLogger( BaseController.class);

    @Resource 
    FormsEndpoint service; // should come in from bean
    ...
}

したがって、これはすべて問題なくコンパイルされ、Tomcat にデプロイされます。しかし、localhost:8080/manager で dept_forms_webclient をクリックすると、次のようにスローされます。

org.springframework.beans.NotWritablePropertyException: Invalid property 'service' of bean class [gov.azdeq.forms.web.controller.BaseController]: Bean property 'service' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

プロキシ Bean が正常に注入されているようです。さまざまな意見に関係なく、FormsEndpoint に設定するべきではないようです。

では、構成がさらに混乱します。ここで何が問題なのか、誰にもわかりますか?

ティア、

まだ学習中のスティーブ

4

1 に答える 1

0

コンテキストファイルの依存性注入を失い、コントローラーで @Autowired を次のように使用することで、すべてが機能するようになりました。

<!-- controllers -->      
<bean id="baseController"                   class="gov.azdeq.forms.web.controller.BaseController" />

@RequestMapping
@Controller("baseController")
public class BaseController
{
    @Autowired
    @Resource(name="formsWebServicePortProxy")
    FormsEndpoint   formsWebServicePortProxy;

@Autowired の使用が機能する理由はわかりませんが、手動のプロパティ注入は機能しません。は。

回答者の皆様のおかげで、少しの洞察が得られました。

ケースクローズ

まだまだ勉強中のスティーブ

于 2014-09-13T04:10:05.373 に答える