使用Web服务 - JaxWsPortProxyFactoryBean或Controller未正确配置

时间:2014-09-12 07:00:36

标签: spring-mvc web-client

Java 1.7 带有Spring-WS 2.1.1的Spring 3.1.1 乔达 Hibernate 3.6 MySQL 5.0.57 Maven 3 雄猫7 Eclipse 3.7

所以SOAP Web服务已经启动并运行。

我的独立Java应用程序可以访问它。

现在我正在尝试构建一个Spring MVC Web客户端来访问它。因此,按照我的想法,我可以用Web服务端点替换标准的webapp服务层。

此后的图案化 http://ankeetmaini.wordpress.com/2013/03/04/jax-ws-client-consuming-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,无论各种各样的tuts说什么。

那么,更多的配置混乱,谁能发现这里有什么问题?

TIA,

Still-learning Stev

1 个答案:

答案 0 :(得分: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有效,但手动属性注入却没有。呵呵。

感谢所有回复的人,这确实给了我一些见解。

CASE CLOSED

仍在学习史蒂夫