package me.test.server;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import me.test.ws.model.AddRequest;
import me.test.ws.model.AddResponse;
import me.test.ws.model.MinusRequest;
import me.test.ws.model.MinusResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 org.springframework.ws.soap.addressing.server.annotation.Action;
import org.springframework.ws.soap.server.endpoint.annotation.SoapAction;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* <ul>
* 说明:<code>@PayloadRoot</code> 和 <code>@SoapAction</code> 都是用来配置 Endpoint
* Mapping的,区别在于:
* <li><code>@SoapAction</code> : 当消息是未加密时,且未指定 soap action时,可以
* <code><SOAP-ENV:Body/></code> 中根元素的命名空间和元素名称进行映射</li>
* <li><code>@PayloadRoot</code> : 当消息加密时,只能通过soap action 这个信息进行映射了。</li>
* </ul>
*
* @param req
* @return
*/
@Endpoint
public class MyMathEndpoint {
public static final Logger logger = LoggerFactory
.getLogger(MyMathEndpoint.class);
public static final String NAMESPACE_URI = "http://www.test.me/MyMath/";
// Using PayloadRootAnnotationMethodEndpointMapping
// @PayloadRoot(namespace = NAMESPACE_URI, localPart = "addRequest")
// public @ResponsePayload
// Element add0(@RequestPayload Source req) {
// logger.debug("add0 : req == {" + req + "}");
// return genSampleAddResopnse(1, 2);
// }
// Using SoapActionAnnotationMethodEndpointMapping
// 注意: <sws:dynamic-wsdl /> 生成的动态wsdl中 <soap:operation/> 的
// <code>soapAction</code> 会为空
// @SoapAction(value = NAMESPACE_URI + "add")
// public @ResponsePayload
// Element add1(@RequestPayload Source req) {
// logger.debug("add1 : req == {" + req + "}");
// return genSampleAddResopnse(1, 2);
// }
/*
// Using PayloadRootAnnotationMethodEndpointMapping
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "addRequest")
public @ResponsePayload
AddResponse add2(@RequestPayload AddRequest req) {
int x = req.getX();
int y = req.getY();
int out = x + y;
logger.debug("add2 : req == {x:" + x + ", y:" + y + "}, resp = {out : "
+ out + "}");
AddResponse resp = new AddResponse();
resp.setOut(out);
return resp;
}
*/
// Using AnnotationActionEndpointMapping
@Action(value = NAMESPACE_URI + "add")
public @ResponsePayload
AddResponse add3(@RequestPayload AddRequest req) {
int x = req.getX();
int y = req.getY();
int out = x + y;
logger.debug("add3 : req == {x:" + x + ", y:" + y + "}, resp = {out : "
+ out + "}");
AddResponse resp = new AddResponse();
resp.setOut(out);
return resp;
}
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "minusRequest")
public @ResponsePayload
MinusResponse minus(@RequestPayload MinusRequest req) {
int x = req.getX();
int y = req.getY();
int out = x - y;
logger.debug("minus : req == {x:" + x + ", y:" + y
+ "}, resp = {out : " + out + "}");
MinusResponse resp = new MinusResponse();
resp.setOut(out);
return resp;
}
public Element genSampleAddResopnse(int x, int y) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
Document doc = builder.newDocument();
Element out = doc.createElement("t:out");
out.appendChild(doc.createTextNode("333"));
Element addResponse = doc.createElementNS(NAMESPACE_URI,
"t:addResponse");
addResponse.appendChild(out);
return addResponse;
}
}