doclitwrappedplusmethodmarshaller.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 743 行 · 第 1/3 页
JAVA
743 行
}
} else {
// Header Result:
// Put the return object onto the message
if (returnType != void.class) {
Element returnElement = null;
QName returnQName = new QName(operationDesc.getResultTargetNamespace(),
operationDesc.getResultName());
if (marshalDesc.getAnnotationDesc(returnType).hasXmlRootElement()) {
returnElement = new Element(returnObject, returnQName);
} else {
returnElement = new Element(returnObject, returnQName, returnType);
}
Class byJavaType =
MethodMarshallerUtils.isNotJAXBRootElement(returnType, marshalDesc) ? returnType : null;
MethodMarshallerUtils.toMessage(returnElement,
returnType,
operationDesc.isListType(),
marshalDesc,
m,
byJavaType,
true);
}
}
// Now create the single JAXB element
String wrapperName = marshalDesc.getResponseWrapperClassName(operationDesc);
Class cls = MethodMarshallerUtils.loadClass(wrapperName);
JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl();
Object object = wrapperTool.wrap(cls, nameList, objectList,
marshalDesc.getPropertyDescriptorMap(cls));
QName wrapperQName = new QName(operationDesc.getResponseWrapperTargetNamespace(),
operationDesc.getResponseWrapperLocalName());
// Make sure object can be rendered as an element
if (!marshalDesc.getAnnotationDesc(cls).hasXmlRootElement()) {
object = new JAXBElement(wrapperQName, cls, object);
}
// Put the object into the message
JAXBBlockFactory factory =
(JAXBBlockFactory)FactoryRegistry.getFactory(JAXBBlockFactory.class);
Block block = factory.createFrom(object,
new JAXBBlockContext(packages, packagesKey),
wrapperQName); // The factory will get the qname from the value
m.setBodyBlock(block);
// Now place the headers in the message
if (headerPDEList.size() > 0) {
// Use "by java type" marshalling if necessary
for (PDElement pde : headerPDEList) {
Class actualType = pde.getParam().getParameterActualType();
if (MethodMarshallerUtils.isNotJAXBRootElement(actualType, marshalDesc)) {
pde.setByJavaTypeClass(actualType);
}
}
MethodMarshallerUtils.toMessage(headerPDEList, m, packages);
}
return m;
} catch (Exception e) {
throw ExceptionFactory.makeWebServiceException(e);
}
}
public Message marshalRequest(Object[] signatureArguments, OperationDescription operationDesc)
throws WebServiceException {
if (log.isDebugEnabled()) {
log.debug("Calling DocLitWrapperPlusMethodMarshaller.marshalRequest");
log.debug(
" The DocLitWrapped Plus marshaller is used when the web service method deviates from the normal doc/lit rules.");
}
EndpointInterfaceDescription ed = operationDesc.getEndpointInterfaceDescription();
EndpointDescription endpointDesc = ed.getEndpointDescription();
Protocol protocol = Protocol.getProtocolForBinding(endpointDesc.getClientBindingID());
MarshalServiceRuntimeDescription marshalDesc =
MethodMarshallerUtils.getMarshalDesc(endpointDesc);
TreeSet<String> packages = marshalDesc.getPackages();
String packagesKey = marshalDesc.getPackagesKey();
// Note all exceptions are caught and rethrown with a WebServiceException
try {
// Sample Document message
// ..
// <soapenv:body>
// <m:operation>
// <param>hello</param>
// </m:operation>
// </soapenv:body>
//
// Important points.
// 1) There is no operation element under the body.
// 2) The data blocks are located underneath the body.
// 3) The name of the data block (m:operation) is defined by the schema and match the name of the operation.
// This is called the wrapper element. The wrapper element has a corresponding JAXB element pojo.
// 4) The parameters (m:param) are child elements of the wrapper element.
// Get the operation information
ParameterDescription[] pds = operationDesc.getParameterDescriptions();
// Create the message
MessageFactory mf = (MessageFactory)FactoryRegistry.getFactory(MessageFactory.class);
Message m = mf.create(protocol);
// In usage=WRAPPED, there will be a single block in the body.
// The signatureArguments represent the child elements of that block
// The first step is to convert the signature arguments into list
// of parameter values
List<PDElement> pdeList = MethodMarshallerUtils.getPDElements(marshalDesc,
pds,
signatureArguments,
true, // input
true, false);
// Now we want to create a single JAXB element that contains the
// ParameterValues. We will use the wrapper tool to do this.
// Create the inputs to the wrapper tool
ArrayList<String> nameList = new ArrayList<String>();
Map<String, Object> objectList = new HashMap<String, Object>();
List<PDElement> headerPDEList = new ArrayList<PDElement>();
Iterator<PDElement> it = pdeList.iterator();
while (it.hasNext()) {
PDElement pde = it.next();
String name = pde.getParam().getParameterName();
if (!pde.getParam().isHeader()) {
// Normal case:
// The object list contains type rendered objects
Object value = pde.getElement().getTypeValue();
nameList.add(name);
objectList.put(name, value);
} else {
// Header Case:
// Remove the header from the list, it will
// not be placed in the wrapper
it.remove();
headerPDEList.add(pde);
}
}
// Now create the single JAXB element
String wrapperName = marshalDesc.getRequestWrapperClassName(operationDesc);
Class cls = MethodMarshallerUtils.loadClass(wrapperName);
JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl();
Object object = wrapperTool.wrap(cls, nameList, objectList,
marshalDesc.getPropertyDescriptorMap(cls));
QName wrapperQName = new QName(operationDesc.getRequestWrapperTargetNamespace(),
operationDesc.getRequestWrapperLocalName());
// Make sure object can be rendered as an element
if (!marshalDesc.getAnnotationDesc(cls).hasXmlRootElement()) {
object = new JAXBElement(wrapperQName, cls, object);
}
// Put the object into the message
JAXBBlockFactory factory =
(JAXBBlockFactory)FactoryRegistry.getFactory(JAXBBlockFactory.class);
Block block = factory.createFrom(object,
new JAXBBlockContext(packages, packagesKey),
wrapperQName); // The factory will get the qname from the value
m.setBodyBlock(block);
// Now place the headers in the message
if (headerPDEList.size() > 0) {
// Use "by java type" marshalling if necessary
for (PDElement pde : headerPDEList) {
Class actualType = pde.getParam().getParameterActualType();
if (MethodMarshallerUtils.isNotJAXBRootElement(actualType, marshalDesc)) {
pde.setByJavaTypeClass(actualType);
}
}
MethodMarshallerUtils.toMessage(headerPDEList, m, packages);
}
return m;
} catch (Exception e) {
throw ExceptionFactory.makeWebServiceException(e);
}
}
public Message marshalFaultResponse(Throwable throwable, OperationDescription operationDesc,
Protocol protocol) throws WebServiceException {
if (log.isDebugEnabled()) {
log.debug("Calling DocLitWrapperPlusMethodMarshaller.marshalFaultResponse");
log.debug(
" The DocLitWrapped Plus marshaller is used when the web service method deviates from the normal doc/lit rules.");
}
EndpointInterfaceDescription ed = operationDesc.getEndpointInterfaceDescription();
EndpointDescription endpointDesc = ed.getEndpointDescription();
MarshalServiceRuntimeDescription marshalDesc =
MethodMarshallerUtils.getMarshalDesc(endpointDesc);
TreeSet<String> packages = marshalDesc.getPackages();
// We want to respond with the same protocol as the request,
// It the protocol is null, then use the Protocol defined by the binding
if (protocol == null) {
protocol = Protocol.getProtocolForBinding(endpointDesc.getBindingType());
}
// Note all exceptions are caught and rethrown with a WebServiceException
try {
// Create the message
MessageFactory mf = (MessageFactory)FactoryRegistry.getFactory(MessageFactory.class);
Message m = mf.create(protocol);
// Put the fault onto the message
MethodMarshallerUtils.marshalFaultResponse(throwable,
marshalDesc,
operationDesc,
m);
return m;
} catch (Exception e) {
throw ExceptionFactory.makeWebServiceException(e);
}
}
public Throwable demarshalFaultResponse(Message message, OperationDescription operationDesc)
throws WebServiceException {
if (log.isDebugEnabled()) {
log.debug("Calling DocLitWrapperPlusMethodMarshaller.demarshalFaultResponse");
log.debug(
" The DocLitWrapped Plus marshaller is used when the web service method deviates from the normal doc/lit rules.");
}
EndpointInterfaceDescription ed = operationDesc.getEndpointInterfaceDescription();
EndpointDescription endpointDesc = ed.getEndpointDescription();
MarshalServiceRuntimeDescription marshalDesc =
MethodMarshallerUtils.getMarshalDesc(endpointDesc);
// Note all exceptions are caught and rethrown with a WebServiceException
try {
Throwable t = MethodMarshallerUtils.demarshalFaultResponse(operationDesc,
marshalDesc,
message);
return t;
} catch (Exception e) {
throw ExceptionFactory.makeWebServiceException(e);
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?