从另一个调用Web服务

时间:2014-07-15 06:39:07

标签: java xml web-services jboss

我已经通过此操作获得了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);

但如何在此方法中传递请求或任何参数?

1 个答案:

答案 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();
            }
        }
    }