[英]Calling Web Service from another one
我已經有了執行此操作的SOAP服務:
public class SimpleWSAction extends AbstractActionPipelineProcessor{
public static final Logger logger = Logger.getLogger(SimpleWSAction.class);
private SimpleWSServiceImpl validator = new SimpleWSServiceImpl();
private SimpleWSDAOImpl clientVerificationService = new SimpleWSDAOImpl();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
public SimpleWSAction(ConfigTree _configTree) {
System.out.println(_configTree.toString());
}
@Process
public Message process(Message message) {
if(logger.isInfoEnabled()){ logger.info("SimpleWSAction - START TIME: "+ sdf.format(new Date(System.currentTimeMillis())));}
SimpleWSRequest request = (SimpleWSRequest) message.getBody().get();
ErrorContainer errorContainer = validator.validateRequest(request);
if(!errorContainer.checkIfCriticalErrorOccured()){
clientVerificationService.setPolicyToVerification(prepareDataToVerification(request), errorContainer);
}
SimpleWSResponse response = new SimpleWSResponse();
TechnicalInputEnvelope technicalInputEnvelope = request.getTechnicalInputEnvelope();
response.setTechnicalOutputEnvelope(getTechnicalOutputEnvelope(technicalInputEnvelope, errorContainer));
message.getBody().add(response);
if(logger.isInfoEnabled()){ logger.info("SimpleWSAction - END TIME: "+ sdf.format(new Date(System.currentTimeMillis())));}
return message;
}
}
我認為這是最重要的部分。
這是我的jboss-esb.xml
我正在粘貼它,因為我想知道我是否需要它來調用第二服務
<?xml version="1.0"?>
<jbossesb parameterReloadSecs="5"
xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd http://anonsvn.jboss.org/repos/labs/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd">
<services>
<service category="SimpleWS"
description="SimpleWS" invmScope="GLOBAL" name="SimpleWS">
<security moduleName="SimpleWS"/>
<property name="maxThreads" value="20" />
<actions faultXsd="/contract/fault.xsd" inXsd="/contract/request.xsd"
mep="RequestResponse" outXsd="/contract/response.xsd">
<action class="com.ist.esb.error.ErrorServiceAction" name="CAErrorService" process="process" />
<action class="pl.warta.simplews.actions.JAXBAction" name="XmlToModel" process="fromXml">
<property name="CLASS" value="pl.warta.simplews.model.request.SimpleWSRequest"/>
</action>
<action class="pl.warta.simplews.actions.SimpleWSAction" name="SimpleWSAction" />
<action class="pl.warta.simplews.actions.JAXBAction" name="ModelToXml" process="toXml">
<property name="CLASS" value="pl.warta.simplews.model.response.SimpleWSResponse"/>
</action>
</service>
</services>
更重要的是,我得到了第二個類似的服務。 我想做的是調用名為AdvacedService
的第二個服務(讓我們假設它正在執行相同的工作-它是具有更改的對象名稱等的副本)。 如何通過此服務調用它? 將來自第一服務的請求作為第二服務的請求傳遞或傳遞一些變量怎么樣? (第二項服務是另一個項目)
PS:對某些非英語變量表示抱歉
我正在考慮這樣稱呼它:
String wsdlURL = http://localhost:8080/AdvanceWSService/services/AdvanceWS?wsdl";
String namespace = "http://advancews.com";
String serviceName = "AdvanceWSService";
QName serviceQN = new QName(namespace, serviceName);
ServiceFactory serviceFactory = ServiceFactory.newInstance();
/* The "new URL(wsdlURL)" parameter is optional */
Service service = serviceFactory.createService(new URL(wsdlURL), serviceQN);
但是如何在此方法中傳遞請求或任何參數?
如果您不打算為其提供復雜類型,則不能使用JaxWsDynamicClientFactory
另外,從技術上講,您不必將“個人”類型導入客戶端。 您真正需要做的就是了解類型,並在運行時使用反射生成類的實例。
您在此處使用的createClient版本僅適用於接受簡單類型的Web服務操作。 為了能夠將復雜類型傳遞給動態Web服務客戶端,
JaxWsDynamicClientFactory需要使用以下內容動態生成必要的支持類:
ClassLoader loader = this.getClass().getClassLoader();
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("wsdlPath", classLoader);
這將創建Client對象以及必要的pojos。
然后,您可以通過以下方式致電服務:
//動態加載Model類的實例。 您無需導入,只需將類名稱配置為應用程序屬性
Object model = Thread.currentThread().getContextClassLoader().loadClass("foo.bar.Model").newInstance();
Method theMethod = person.getClass().getMethod("setAge", Integer.class);
theMethod.invoke(person, 55); //set a property
client.invoke("testPerson", model); //invoke the operation.
您可以嘗試通過傳遞參數:
import javax.xml.rpc.Call;
import javax.xml.rpc.Service;
import javax.xml.rpc.JAXRPCException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.ParameterMode;
public class DIIHello {
private static String qnameService = "MyHelloService";
private static String qnamePort = "MyHelloServiceRPC";
private static String endpoint =
"http://localhost:80/MyHelloService/MyHelloService";
private static String BODY_NAMESPACE_VALUE =
"urn:MyHelloService/wsdl";
private static String ENCODING_STYLE_PROPERTY =
"javax.xml.rpc.encodingstyle.namespace.uri";
private static String NS_XSD =
"http://www.w3.org/2001/XMLSchema";
private static String URI_ENCODING =
"http://schemas.xmlsoap.org/soap/encoding/";
public static void main(String[] args) {
try {
ServiceFactory factory =
ServiceFactory.newInstance();
Service service =
factory.createService(new QName(qnameService));
QName port = new QName(qnamePort);
Call call = service.createCall(port);
call.setTargetEndpointAddress(endpoint);
call.setProperty(Call.SOAPACTION_USE_PROPERTY,
new Boolean(true));
call.setProperty(Call.SOAPACTION_URI_PROPERTY, "");
call.setProperty(ENCODING_STYLE_PROPERTY,
URI_ENCODING);
QName QNAME_TYPE_STRING = new QName(NS_XSD, "string");
call.setReturnType(QNAME_TYPE_STRING);
call.setOperationName(new QName(BODY_NAMESPACE_VALUE,
"sayHello"));
//For passing parameter
call.addParameter("String_1", QNAME_TYPE_STRING,
ParameterMode.IN);
String[] params = { "Kuntal" };
String result = (String)call.invoke(params);
System.out.println(result);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.