0

Web サービス クライアントと、異なるプラットフォームに存在するサービス自体との間にプロキシを作成する必要があります。その意図は、リクエストを実際のサービスに渡す前に、特定の XML ノードでいくつかの検証を行うことです。検証が成功すると、クライアントは現在と同じように、プロキシの存在に気付かずに回答を受け取ります。

それが実行されるプラットフォームはJavaサーバーなので、最初に考えたのは、タスクを実行するサーブレットを構築することです。明日、いくつかのテストコードの実行を開始しますが、これを事前に実装する方法についてのヒントをいただければ幸いです。

4

1 に答える 1

0

JAX-WSプロバイダーベースのプロキシ/ゲートウェイの擬似コードは次のとおりです。

@WebServiceProvider
public class ServiceGateway implements Provider<SOAPMessage> {
    private static final QName SERVICE_NAME = new QName("http://ws.com",
            "Service");
    private static final QName PORT_NAME = new QName("http://ws.com", "Port");
    private static final String FAULT_MESSAGE = "fault.message";
    private static final Service service = Service.create(SERVICE_NAME);

    @Override
    public SOAPMessage invoke(SOAPMessage inboundMessage) {
        Dispatch<SOAPMessage> dispatch = service.createDispatch(PORT_NAME,
                SOAPMessage.class, Mode.MESSAGE);
        dispatch.getRequestContext().put(
                BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
                "http://real.destination.address");
        // Handler is required to pass SOAPFault messages
        @SuppressWarnings("rawtypes")
        List<Handler> handlers = new ArrayList<Handler>(dispatch.getBinding()
                .getHandlerChain());
        handlers.add(new SOAPHandler<SOAPMessageContext>() {
            @Override
            public void close(MessageContext context) {
            }

            @Override
            public boolean handleFault(SOAPMessageContext context) {
                context.put(FAULT_MESSAGE, context.getMessage());
                context.setScope(FAULT_MESSAGE, Scope.APPLICATION);
                return true;
            }

            @Override
            public boolean handleMessage(SOAPMessageContext context) {
                return true;
            }

            @Override
            public Set<QName> getHeaders() {
                return null;
            }
        });
        dispatch.getBinding().setHandlerChain(handlers);

        try {
            return dispatch.invoke(inboundMessage);
        } catch (SOAPFaultException exception) {
            return (SOAPMessage) dispatch.getResponseContext().get(
                    FAULT_MESSAGE);
        }
    }
}
于 2013-03-18T12:15:47.170 に答える