Pārlūkot izejas kodu

camel-ws 错误返回修复

huangzhiyong 8 gadi atpakaļ
vecāks
revīzija
4f892ffa63

+ 4 - 0
hos-camel2/src/main/java/camel/api1/route/ApiRouteBulider.java

@ -9,5 +9,9 @@ public class ApiRouteBulider extends RouteBuilder {
    public void configure() throws Exception {
        from("jetty:http://0.0.0.0:9097/api/v7").routeId("camel/api1")
                .process(new ApiProcessor()).log("servers: 0,code: ,order: 0").log("servers: 0,code: ,order: 0");
        from("jetty:http://0.0.0.0:9097/rest").routeId("restTest")
                .to("restlet:http://192.168.1.221:10000/api/v1.0/admin/doctors/admin/13?autoCloseStream=true");
    }
}

+ 1 - 1
hos-camel2/src/main/java/camel/api7/route/CxfConsumerTest.java

@ -11,7 +11,7 @@ import org.springframework.stereotype.Component;
@Component
public class CxfConsumerTest extends RouteBuilder {
    protected static final String SIMPLE_ENDPOINT_ADDRESS = "http://192.168.131.101:3333/soap/ws";
    protected static final String SIMPLE_ENDPOINT_ADDRESS = "http://192.168.131.101:4444/soap/ws";
    protected static final String SIMPLE_ENDPOINT_URI = "cxf:" + SIMPLE_ENDPOINT_ADDRESS
            + "?serviceClass=camel.api7.processor.TestWService"
//            + "&dataFormat=CXF_MESSAGE"

+ 19 - 8
hos-camel2/src/main/java/camel/gateway/processor/ErrorHandle.java

@ -1,5 +1,6 @@
package camel.gateway.processor;
import org.apache.camel.Exchange;
import org.springframework.stereotype.Component;
/**
@ -8,19 +9,29 @@ import org.springframework.stereotype.Component;
 */
@Component("errorHandle")
public class ErrorHandle {
    public String paramError() {
        return "paramError";
    public void paramError(Exchange exchange) {
        exchange.getOut().setHeader("errorCode","paramError");
        exchange.getOut().setBody("paramError");
    }
    public String outdataError() {
        return "outdataError";
    public void outdataError(Exchange exchange) {
        exchange.getOut().setHeader("errorCode","outdataError");
        exchange.getOut().setBody("outdataError");
    }
    public String signValidError() {
        return "signValidError";
    public void signValidError(Exchange exchange) {
        exchange.getOut().setHeader("errorCode","signValidError");
        exchange.getOut().setBody("signValidError");
    }
    public String unauthorizedError() {
        return "unauthorizedError";
    public void unauthorizedError(Exchange exchange) {
        exchange.getOut().setHeader("errorCode","unauthorizedError");
        exchange.getOut().setBody("unauthorizedError");
    }
}

+ 138 - 0
hos-camel2/src/main/java/camel/gateway/processor/WsProcessor.java

@ -0,0 +1,138 @@
package camel.gateway.processor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.message.MessageContentsList;
import org.springframework.stereotype.Component;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import java.io.StringReader;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Component("wsProcessor")
public class WsProcessor implements Processor {
    public void process(Exchange exchange) throws Exception {
        MessageContentsList args = exchange.getIn().getBody(MessageContentsList.class);
        exchange.getOut().setHeader("api", args.get(0));
        exchange.getOut().setHeader("param", args.get(1));
        exchange.getOut().setHeader("timestamp", args.get(2));
        exchange.getOut().setHeader("v", args.get(3));
        exchange.getOut().setHeader("appKey", args.get(4));
        exchange.getOut().setHeader("sign", args.get(5));
    }
    //webservice 接口请求返回
    public SOAPBody responseWs(Exchange exchange) {
        XmlMapper xmlMapper = new XmlMapper();
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            Object errorCode = exchange.getIn().getHeader("errorCode");
            if (errorCode!=null){
                //错误信息返回
                LinkedHashMap<Object, Object> errorMap = new LinkedHashMap<>();
                errorMap.put("errorCode",errorCode);
                String xmlResponse = xmlMapper.writeValueAsString(errorMap);
                return createDefaultSoapMessage(xmlResponse);
            }
            //返回请求结果
            Map<String,Object> map = objectMapper.readValue(exchange.getIn().getBody().toString(),Map.class);
            String xmlResponse = xmlMapper.writeValueAsString(map);
            return createDefaultSoapMessage(xmlResponse);
        } catch (Exception e) {
                e.printStackTrace();
            return createDefaultSoapMessage(e.getClass().getName());
        }
    }
    public SOAPBody request(Exchange exchange) {
        String wsdl = "http://127.0.0.1:8001/esb/ws?wsdl";
        SOAPMessage soapMessage = (SOAPMessage) exchange.getIn().getBody(List.class).get(0);
        if (soapMessage == null) {
            System.out.println("Incoming null message detected...");
            return createDefaultSoapMessage("null");
        }
        try {
            String requestText = requestWs(exchange, wsdl, "plus");
            return createDefaultSoapMessage(requestText);
        } catch (Exception e) {
            e.printStackTrace();
            return createDefaultSoapMessage(e.getClass().getName());
        }
    }
    /**
     * 请求ws
     *
     * @param exchange
     * @param method
     * @return
     * @throws Exception
     */
    public String requestWs(Exchange exchange, String wsdl, String method) throws Exception {
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        org.apache.cxf.endpoint.Client client = dcf.createClient(wsdl);
        //getUser 为接口中定义的方法名称  张三为传递的参数   返回一个Object数组
        Object[] objects = client.invoke(method);
        //输出调用结果
        System.out.println("*****" + objects[0].toString());
        return objects[0].toString();
    }
    /**
     * 生成ws返回内容
     *
     * @param requestMessage
     * @return
     */
    public static SOAPBody createDefaultSoapMessage(String requestMessage) {
        try {
            SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
            SOAPBody body = soapMessage.getSOAPPart().getEnvelope().getBody();
//            QName payloadName = new QName("http://gateway.api", "test", "ns1");
//            SOAPBodyElement payload = body.addBodyElement(payloadName);
//            SOAPElement message = payload.addChildElement("body");
            body.addDocument(parseXMLDocument(requestMessage));
            return body;
        } catch (SOAPException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    /**
     * 解析XML字符串
     * @param xmlString
     * @return
     */
    public static Document parseXMLDocument(String xmlString) {
        if (xmlString == null) {
            throw new IllegalArgumentException();
        }
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(true);
            DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
            return documentBuilder.parse(
                    new InputSource(new StringReader(xmlString)));
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }
}

+ 32 - 0
hos-camel2/src/main/java/camel/gateway/processor/WsService.java

@ -0,0 +1,32 @@
package camel.gateway.processor;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/4/14.
 */
@WebService(name = "esbWService")
public interface WsService {
    @WebMethod
    public Object test();
    @WebMethod
    public Object requestWs(
            @WebParam(name = "api") String api,
            @WebParam(name = "param") String param,
            @WebParam(name = "timestamp") String timestamp,
            @WebParam(name = "v") String v,
            @WebParam(name = "appKey") String appKey,
            @WebParam(name = "sign") String sign
    );
    @WebMethod
    public Object AddProvider(@WebParam(name = "doctor_id") long doctor_id);
}

+ 14 - 4
hos-camel2/src/main/java/camel/gateway/route/GatewayRouterBuilder.java

@ -1,9 +1,10 @@
package camel.gateway.route;
import camel.log.TracerFormatter;
import camel.gateway.processor.ErrorHandle;
import camel.gateway.processor.GatewayProcessor;
import camel.gateway.processor.SignProcessor;
import camel.gateway.processor.WsProcessor;
import camel.log.TracerFormatter;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.processor.interceptor.Tracer;
@ -16,7 +17,11 @@ import org.springframework.stereotype.Component;
 */
@Component
public class GatewayRouterBuilder extends RouteBuilder {
    protected static final String SIMPLE_ENDPOINT_ADDRESS = "http://0.0.0.0:3333/soap/ws";
    protected static final String SIMPLE_ENDPOINT_URI = "cxf:" + SIMPLE_ENDPOINT_ADDRESS
            + "?serviceClass=camel.gateway.processor.WsService"
//            + "&dataFormat=CXF_MESSAGE"
            ;
    @Override
    public void configure() throws Exception {
        this.getContext().setUseMDCLogging(true);
@ -36,6 +41,7 @@ public class GatewayRouterBuilder extends RouteBuilder {
        this.getContext().addInterceptStrategy(tracer);
        this.getContext().getProperties().put(Exchange.LOG_DEBUG_BODY_STREAMS, "true");
        this.getContext().getProperties().put(Exchange.BEAN_MULTI_PARAMETER_ARRAY, "true");
        from("jetty:http://0.0.0.0:9998?matchOnUriPrefix=true").routeId("proxy")
                .to("jetty:http://192.168.1.221:10000?bridgeEndpoint=true&throwExceptionOnFailure=false");
@ -58,8 +64,12 @@ public class GatewayRouterBuilder extends RouteBuilder {
        from("jetty:http://0.0.0.0:9999/sign").routeId("sign")
                .process(new SignProcessor());
        from("jetty:http://0.0.0.0:9999/rest").routeId("restTest")
                .to("restlet:http://192.168.1.221:10000/api/v1.0/admin/doctors/admin/13?autoCloseStream=true");
        from(SIMPLE_ENDPOINT_URI)
                .setHeader(Exchange.BEAN_MULTI_PARAMETER_ARRAY, constant(true))
                .process(new WsProcessor())
                .routingSlip(method(GatewayProcessor.class, "route"))
        .to("bean:wsProcessor?method=responseWs")
        ;
    }
}