我已经通过此操作获得了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
的第二个服务(让我们假设它正在执行相同的工作 - 它是具有更改的对象名称等的副本)。如何从这项服务中调用它?如何将第一服务的请求作为第二服务请求或传递一些变量? (第二项服务是btw的其他项目)
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);
但如何在此方法中传递请求或任何参数?
答案 0 :(得分:0)
如果您不打算为其提供复杂类型,则无法使用JaxWsDynamicClientFactory
另外,从技术上讲,您不必将Person类型导入客户端。您真正需要做的就是了解类型并使用反射来在运行时生成类的实例。
您在此处使用的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();
}
}
}