rpclitmethodmarshaller.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 543 行 · 第 1/2 页
JAVA
543 行
// Indicate the style and operation element name. This triggers the message to
// put the data blocks underneath the operation element
m.setStyle(Style.RPC);
QName rpcOpQName = getRPCOperationQName(operationDesc, false);
String localPart = rpcOpQName.getLocalPart() + "Response";
QName responseOp =
new QName(rpcOpQName.getNamespaceURI(), localPart, rpcOpQName.getPrefix());
m.setOperationElement(responseOp);
// Put the return object onto the message
Class returnType = operationDesc.getResultActualType();
String returnNS = null;
String returnLocalPart = null;
if (operationDesc.isResultHeader()) {
returnNS = operationDesc.getResultTargetNamespace();
returnLocalPart = operationDesc.getResultName();
} else {
returnNS = ""; // According to WSI BP the body part is unqualified
returnLocalPart = operationDesc.getResultPartName();
}
if (returnType != void.class) {
// TODO should we allow null if the return is a header?
//Validate input parameters for operation and make sure no input parameters are null.
//As per JAXWS Specification section 3.6.2.3 if a null value is passes as an argument
//to a method then an implementation MUST throw WebServiceException.
if (returnObject == null) {
throw ExceptionFactory.makeWebServiceException(Messages.getMessage(
"NullParamErr1", "Return", operationDesc.getJavaMethodName(),
"rpc/lit"));
}
Element returnElement = null;
QName returnQName = new QName(returnNS, returnLocalPart);
if (marshalDesc.getAnnotationDesc(returnType).hasXmlRootElement()) {
returnElement = new Element(returnObject, returnQName);
} else {
returnElement = new Element(returnObject, returnQName, returnType);
}
// Use marshalling by java type if necessary
Class byJavaType = null;
if (!operationDesc.isResultHeader() ||
MethodMarshallerUtils.isNotJAXBRootElement(returnType, marshalDesc)) {
byJavaType = returnType;
}
MethodMarshallerUtils.toMessage(returnElement,
returnType,
operationDesc.isListType(),
marshalDesc,
m,
byJavaType,
operationDesc.isResultHeader());
}
// Convert the holder objects into a list of JAXB objects for marshalling
List<PDElement> pdeList =
MethodMarshallerUtils.getPDElements(marshalDesc,
pds,
signatureArgs,
false, // output
false,
true); // use partName since this is rpc/lit
// We want to use "by Java Type" marshalling for
// all body elements and all non-JAXB objects
for (PDElement pde : pdeList) {
ParameterDescription pd = pde.getParam();
Class type = pd.getParameterActualType();
if (!pd.isHeader() ||
MethodMarshallerUtils.isNotJAXBRootElement(type, marshalDesc)) {
pde.setByJavaTypeClass(type);
}
}
// TODO Should we check for null output body values? Should we check for null output header values ?
// Put values onto the message
MethodMarshallerUtils.toMessage(pdeList, m, packages);
return m;
} catch (Exception e) {
throw ExceptionFactory.makeWebServiceException(e);
}
}
public Object demarshalResponse(Message message, Object[] signatureArgs,
OperationDescription operationDesc)
throws WebServiceException {
EndpointInterfaceDescription ed = operationDesc.getEndpointInterfaceDescription();
EndpointDescription endpointDesc = ed.getEndpointDescription();
// Note all exceptions are caught and rethrown with a WebServiceException
try {
// Sample RPC message
// ..
// <soapenv:body>
// <m:opResponse xmlns:m="urn://api">
// <param xsi:type="data:foo" >...</param>
// </m:op>
// </soapenv:body>
//
// Important points.
// 1) RPC has an operation element under the body. This is the name of the
// wsdl operation.
// 2) The data blocks are located underneath the operation element. (In doc/lit
// the data elements are underneath the body.
// 3) The name of the data blocks (param) are defined by the wsdl:part not the
// schema. Note that it is unqualified per WSI-BP
// 4) The type of the data block (data:foo) is defined by schema (thus there is
// JAXB type rendering.
// 5) We always send an xsi:type, but other vendor's may not.
// Get the operation information
ParameterDescription[] pds = operationDesc.getParameterDescriptions();
MarshalServiceRuntimeDescription marshalDesc =
MethodMarshallerUtils.getMarshalDesc(endpointDesc);
TreeSet<String> packages = marshalDesc.getPackages();
// Indicate that the style is RPC. This is important so that the message understands
// that the data blocks are underneath the operation element
message.setStyle(Style.RPC);
// Get the return value.
Class returnType = operationDesc.getResultActualType();
Object returnValue = null;
boolean hasReturnInBody = false;
if (returnType != void.class) {
// If the webresult is in the header, we need the name of the header so that we can find it.
Element returnElement = null;
// Use "byJavaType" unmarshalling if necessary
Class byJavaType = null;
if (!operationDesc.isResultHeader() ||
MethodMarshallerUtils.isNotJAXBRootElement(returnType, marshalDesc)) {
byJavaType = returnType;
}
if (operationDesc.isResultHeader()) {
returnElement = MethodMarshallerUtils
.getReturnElement(packages, message, byJavaType, operationDesc.isListType(), true,
operationDesc.getResultTargetNamespace(),
operationDesc.getResultPartName(),
MethodMarshallerUtils.numOutputBodyParams(pds) > 0);
} else {
returnElement = MethodMarshallerUtils
.getReturnElement(packages, message, byJavaType, operationDesc.isListType(), false, null, null,
MethodMarshallerUtils.numOutputBodyParams(pds) > 0);
hasReturnInBody = true;
}
returnValue = returnElement.getTypeValue();
// TODO should we allow null if the return is a header?
//Validate input parameters for operation and make sure no input parameters are null.
//As per JAXWS Specification section 3.6.2.3 if a null value is passes as an argument
//to a method then an implementation MUST throw WebServiceException.
if (returnValue == null) {
throw ExceptionFactory.makeWebServiceException(Messages.getMessage(
"NullParamErr1", "Return", operationDesc.getJavaMethodName(),
"rpc/lit"));
}
}
// We want to use "by Java Type" unmarshalling for
// all body elements and all non-JAXB objects
Class[] javaTypes = new Class[pds.length];
for (int i = 0; i < pds.length; i++) {
ParameterDescription pd = pds[i];
Class type = pd.getParameterActualType();
if (!pd.isHeader() ||
MethodMarshallerUtils.isNotJAXBRootElement(type, marshalDesc)) {
javaTypes[i] = type;
}
}
// Unmarshall the ParamValues from the Message
List<PDElement> pvList = MethodMarshallerUtils.getPDElements(pds,
message,
packages,
false, // output
hasReturnInBody,
javaTypes); // unmarshal by type
// TODO Should we check for null output body values? Should we check for null output header values ?
// Populate the response Holders
MethodMarshallerUtils.updateResponseSignatureArgs(pds, pvList, signatureArgs);
return returnValue;
} catch (Exception e) {
throw ExceptionFactory.makeWebServiceException(e);
}
}
public Message marshalFaultResponse(Throwable throwable,
OperationDescription operationDesc, Protocol protocol)
throws WebServiceException {
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 {
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);
}
}
/**
* @param opDesc
* @return qualified qname to use in the rpc message to represent the operation (per WSI BP)
*/
private static QName getRPCOperationQName(OperationDescription opDesc, boolean isRequest) {
QName qName = opDesc.getName();
String localPart = qName.getLocalPart();
String uri = null;
if (isRequest) {
uri = opDesc.getBindingInputNamespace();
} else {
uri = opDesc.getBindingOutputNamespace();
}
String prefix = "rpcOp"; // Prefer using an actual prefix
qName = new QName(uri, localPart, prefix);
return qName;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?