如何解决使用对象而不是模式xml时的@PayloadRoot值
|| 我正在使用对象作为从客户端到服务服务器的消息。 应该如何配置端点以便找到服务? @PayloadRoot在这里似乎不合适,因为我不使用xml模式,而是使用带注释的对象 @XmlRootElement(即街道) 我的代码: spring-ws-servlet.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:context=\"http://www.springframework.org/schema/context\"
xmlns:sws=\"http://www.springframework.org/schema/web-services\"
xmlns:oxm=\"http://www.springframework.org/schema/oxm\"
xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd\">
<context:component-scan base-package=\"com.coral.project.endpoints\"/>
<sws:annotation-driven />
<sws:dynamic-wsdl id=\"test\" portTypeName=\"TestCase\" locationUri=\"/testService/\"
targetNamespace=\"http://www.example.org/schemasDef/test/deFinitions\">
<sws:xsd location=\"/WEB-INF/schemasDef/test.xsd\"/>
</sws:dynamic-wsdl>
<bean id=\"springWSClient\" class=\"com.coral.project.endpoints.SpringWSClient\">
<property name=\"defaultUri\" value=\"http://localhost:8080/parking/springServices/testService/\"/>
<property name=\"marshaller\" ref=\"marshaller\" />
<property name=\"unmarshaller\" ref=\"marshaller\" />
</bean>
<oxm:jaxb2-marshaller id=\"marshaller\">
<oxm:class-to-be-bound name=\"com.coral.project.entity.Street\"/>
</oxm:jaxb2-marshaller>
</beans>
客户端:
public class SpringWSClient extends WebServiceGatewaySupport {
public void getSum() throws SOAPException,IOException,TransformerException {
StreetDao streetDao = SpringUtils.getBean(StreetDao.class);
Street street = streetDao.findById(1);
getwebservicetemplate().marshalSendAndReceive(street);
}
}
端点:
@Endpoint
public class SpringWsEndpoint {
@Inject
private SpringWebService springWebService;
@PayloadRoot(localPart = \"street\",namespace = \"http://blahblah\")
@ResponsePayload
public Element handleTestRequest(@RequestPayload SAXSource testRequest) throws Exception {
String fisrt = firstNum.valueOf(testRequest);
String second = secondNum.valueOf(testRequest);
String sum = springWebService.sum(Integer.parseInt(fisrt),Integer.parseInt(second)).toString();
Element responseElement = new Element(\"TestRequest\");
Element sumElement = new Element(\"sum\");
sumElement.setText(sum);
responseElement.setContent(sumElement);
return responseElement;
}
}
解决方法
了解如何做。不得不进行一些修复。最重要的是,在我的情况下,@ XmlRootElement名称和名称空间属性是必需的。因此,工作代码为:
测试文件
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"
xmlns:test=\"http://www.example.org/schemasDef/test/schemas\"
elementFormDefault=\"qualified\"
targetNamespace=\"http://www.example.org/schemasDef/test/schemas\">
<xs:element name=\"TestRequest\">
<xs:complexType>
<xs:all>
<xs:element name=\"firstNum\" type=\"xs:integer\" />
<xs:element name=\"secondNum\" type=\"xs:integer\" />
<xs:element name=\"sum\" type=\"xs:integer\" />
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
TestRequest.java
package com.coral.project.entity;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name=\"TestRequest\",namespace=\"http://www.example.org/schemasDef/test/schemas\")
public class TestRequest {
private Integer firstNum;
private Integer secondNum;
private Integer sum;
public Integer getFirstNum() {
return firstNum;
}
public void setFirstNum(Integer firstNum) {
this.firstNum = firstNum;
}
public Integer getSecondNum() {
return secondNum;
}
public void setSecondNum(Integer secondNum) {
this.secondNum = secondNum;
}
public Integer getSum() {
return sum;
}
public void setSum(Integer sum) {
this.sum = sum;
}
}
spring-ws-servlet.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:context=\"http://www.springframework.org/schema/context\"
xmlns:sws=\"http://www.springframework.org/schema/web-services\"
xmlns:oxm=\"http://www.springframework.org/schema/oxm\"
xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd\">
<context:component-scan base-package=\"com.coral.project.endpoints\"/>
<sws:annotation-driven marshaller=\"marshaller\" unmarshaller=\"marshaller\"/>
<sws:dynamic-wsdl id=\"test\" portTypeName=\"TestCase\" locationUri=\"/testService/\"
targetNamespace=\"http://www.example.org/schemasDef/test/definitions\">
<sws:xsd location=\"/WEB-INF/schemasDef/test.xsd\"/>
</sws:dynamic-wsdl>
<bean id=\"springWSClient\" class=\"com.coral.project.endpoints.SpringWSClient\">
<property name=\"defaultUri\" value=\"http://localhost:8080/parking/springServices/testService\"/>
<property name=\"marshaller\" ref=\"marshaller\" />
<property name=\"unmarshaller\" ref=\"marshaller\" />
</bean>
<oxm:jaxb2-marshaller id=\"marshaller\">
<oxm:class-to-be-bound name=\"com.coral.project.entity.TestRequest\"/>
</oxm:jaxb2-marshaller>
</beans>
SpringWsEndpoint.java
package com.coral.project.endpoints;
import javax.inject.Inject;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
import com.coral.project.entity.TestRequest;
import com.coral.project.services.ifc.SpringWebService;
@Endpoint
public class SpringWsEndpoint {
private static final String NAMESPACE_URI = \"http://www.example.org/schemasDef/test/schemas\";
@Inject
private SpringWebService springWebService;
@PayloadRoot(namespace = NAMESPACE_URI,localPart = \"TestRequest\")
@ResponsePayload
public TestRequest handleTestRequestObj(@RequestPayload TestRequest testRequest) throws Exception {
Integer sum = springWebService.sum(testRequest.getFirstNum(),testRequest.getSecondNum());
testRequest.setSum(sum);
return testRequest;
}
}
SpringWsClient.java
package com.coral.project.endpoints;
import java.io.IOException;
import javax.xml.soap.SOAPException;
import javax.xml.transform.TransformerException;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import com.coral.project.entity.TestRequest;
public class SpringWSClient extends WebServiceGatewaySupport {
public TestRequest getTestRequest() throws SOAPException,IOException,TransformerException {
TestRequest testRequest = new TestRequest();
testRequest.setFirstNum(6);
testRequest.setSecondNum(9);
TestRequest testResponse = (TestRequest)getWebServiceTemplate().marshalSendAndReceive(testRequest);
return testResponse;
}
}
, 多亏了我,我不得不为自己的需要做出类似的trick俩,而您的解决方案是使它正常工作所需要的最后一点。我将在这里总结差异以供参考。
我正在研究一个获取任意XML并返回任意XML的端点。无需进行编组或解组,因为据说数据量很大。接收端记录在这里。
一个简单的String容器:
package our.site.etc;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name=\"StringResponse\",namespace=\"http://link.to.our/schemas/service/endpoint/yyyy/mm/dd\")
public class StringResponse {
private String responseData;
public StringResponse() {
;
}
public StringResponse(String data) {
this.responseData = data;
}
public String getResponseData() {
return responseData;
}
public void setResponseData(String data) {
this.responseData = data;
}
}
端点方法:
@PayloadRoot(localPart = LOCALPART,namespace = NAMESPACE)
@ResponsePayload
public @ResponseBody StringResponse receiveMessage(MessageContext messageContext) throws Exception {
// do our thing:
return new StringResponse(super.handleMessage(messageContext));
}
最后一步是省略WSClient部分,仅定义jaxb2 marshaller:
<oxm:jaxb2-marshaller id=\"marshaller\">
<oxm:class-to-be-bound name=\"our.site.etc.StringResponse\"/>
</oxm:jaxb2-marshaller>
现在,我的端点在CDATA中返回响应字符串。实际上,它只是传递数据,对数据做最少的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。