2012-02-02 4 views
4

시나리오는 다음과 같습니다. 우리는 PeopleSoft가 있으며 salesforce에서 메시지를주고 받고 싶습니다. 불행히도 PeopleSoft에는 wsdl을 사용하고 클래스를 생성하는 wsimport와 같은 도구가 없습니다. wsdl을 소비하는 것이 있지만 스텁 메시지 객체를 생성하는 것은 전부입니다. 개발자는 xml 메시지 문자열을 수동으로 생성하는 코드를 작성해야합니다.jax-ws를 사용하여 xml을 생성 할 수는 있지만

나는 분명히 그 모든 것을하고 싶지 않습니다. 따라서 Java가 PeopleSoft에서 호출 될 수 있다는 것을 알고 있습니다. 또한 생성 된 클래스를 사용하여 메시지를 보낼 수도 있지만 PeopleSoft에 내장 된 메시지 모니터링 기능을 사용하고자합니다.

그래서 내가 뜻을 생각하고 가능한 해결책 :

  • 잡고 XML
  • (메시지를 전송하지 않고)

    1. 호출 자바에서 웹 서비스 방법은 피플 메커니즘
    2. 을 통해 XML을 전송
    3. 응답 XML 가져 오기
    4. 응답 XML 클래스에 응답을 다시 전달
    5. Java 클래스를 사용하여 gra b 값은 xml 내

    나는 미친가요?

    p.s. 나는 초보자 자바 개발자이다.

    다음은 XML을 가져 오는 내 처리기 클래스이지만, 메시지가 전송되지 않도록하는 방법이 필요하다.

    public class LoggingHandler implements SOAPHandler<SOAPMessageContext> { 
    // change this to redirect output if desired 
    private static PrintStream out = System.out; 
    private String xmlOut = null; 
    
    public Set<QName> getHeaders() { 
        return null; 
    } 
    
    public boolean handleMessage(SOAPMessageContext smc) { 
        logToSystemOut(smc); 
        return true; 
    } 
    
    public boolean handleFault(SOAPMessageContext smc) { 
        logToSystemOut(smc); 
        return true; 
    } 
    
    // nothing to clean up 
    public void close(MessageContext messageContext) { 
    } 
    
    public String getXmlOut() { 
        return xmlOut; 
    } 
    
    /* 
    * Check the MESSAGE_OUTBOUND_PROPERTY in the context 
    * to see if this is an outgoing or incoming message. 
    * Write a brief message to the print stream and 
    * output the message. The writeTo() method can throw 
    * SOAPException or IOException 
    */ 
    private void logToSystemOut(SOAPMessageContext smc) { 
        Boolean outboundProperty = (Boolean) 
         smc.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
    
    
        SOAPMessage message = smc.getMessage(); 
        try { 
         ByteArrayOutputStream baOut = new ByteArrayOutputStream(); 
         message.writeTo(baOut); 
         xmlOut = new String(baOut.toByteArray()); 
    
    
        } catch (Exception e) { 
         out.println("Exception in handler: " + e); 
        } 
    } 
    
    } 
    
  • 답변

    1

    해결책 중 하나는 JAX-WS의 SocketFatory을 대체하는 것일 수 있습니다.

    javax.net.SocketFactory socketFactory = new MySocketFactory(); 
    Service service = Service.create(new URL(wsdl), new QName(namespace, servicename)); 
    Dispatch<SOAPMessage> dispatch = service.createDispatch(methodToBeCalled, SOAPMessage.class, Service.Mode.MESSAGE); 
    dispatch.getRequestContext().put(com.sun.xml.ws.developer.JAXWSProperties.SSL_SOCKET_FACTORY, socketFactory); 
    // or ((BindingProvider) Service.getPort(SEIInterface.class)).getRequestContext().put(...); 
    

    을 그리고 MySocketFactory에서 다른 채널로 파이프 메시지를 의지 소켓을 만들 무료입니다 : 대략은 다음과 같이 표시됩니다.

    2

    Java 웹 서비스 인 JAX-WS에서 체계적인 방법이 있습니다. SOAP Handler를 사용하여 인터셉터 패턴을 적용하면됩니다. 핸들러 클래스는 handleMessage (SOAPMessageContext mc) 메소드의 메시지를 가로 채고, SOAP Envelope의 XML 본문으로 원하는 작업을 수행합니다. SOAPMessage 추가 처리를 중지하십시오.

    그러면 XML을 원하는대로 처리 할 수 ​​있습니다 (예 : peoplesoft 메커니즘을 통해 전송). 그리고 응답이 peoplesoft에서 돌아 오면 아웃 바운드 핸들러 체인을 우회하십시오 ... (실제로 체인을 통과하는 방법을 찾아야합니다). 나는 그저 생각 만 꾸미고있다. POC를 만들어야한다. 나는 그렇게하지 않았다. 그렇지 않으면 공유 코드가 생겼을 것이다. 그러나 이것은 절대적으로 가능합니다.

    +0

    새로운 웹 서비스 엔드 포인트를 작성하는 경우 SEI는 높은 추상화를 위해 제공되는 XML로 작업하기 때문에 공급자 기반 메커니즘 인 SEI JAX-WS 메커니즘을 선호합니다. –

    +0

    예제를 살펴보면서 처리기 클래스를 구현했지만 추가 처리에서 SOAP 메시지를 어떻게 멈출 수 있는지 확신 할 수 없습니다. 그 어떤 힌트라도? 다음은 내 처리기 클래스입니다. 'public boolean handleMessage (SOAPMessageContext smc) { logToSystemOut (smc); return true; } 개인 무효 logToSystemOut (SOAPMessageContext smc) { SOAPMessage message = smc.getMessage(); 시도 { ByteArrayOutputStream baOut = new ByteArrayOutputStream(); message.writeTo (baOut); xmlOut = new String (baOut.toByteArray()); } } – willard

    +0

    1. PeopleSoft에서 SalesForce에 의해 노출 된 서비스를 호출하고 있다고 생각합니다. 따라서 클라이언트 측 런타임에서 생성하는 SOAP 메시지를 가로 채기 (PeopleSoft 메커니즘을 통해 전달할 수 있도록)하기 때문에 클라이언트 측에서 Handler를 정의해야합니다. 핸들러를 정의한 방법은 서버 측에서 핸들러를 정의하는 데 사용됩니다. 클라이언트 측 핸들러는 다르게 정의됩니다. 아이디어를 얻으려면 http://bit.ly/zGerml을 참조하십시오. –

    1

    XML 만 필요하다고 말하면 SOAP 메시지 또는 요청/응답 유형에 대해 이야기하고 있습니까? 두 번째 사례에 대해 이야기하고 있는지 확실하지 않지만 XML 만 원한다면 JAXB를 직접 사용하지 않는 이유는 무엇입니까?

    그렇다면 WSDL에서 스키마를 추출하고 유형을 생성 한 다음 (예 : WSDL에서 작업 "A"에 대해 RequestA 및 ResponseA가 있다고 가정) JAXB의 marshaller/unmarshaller를 사용하여 XML. 그런 다음 원하는 프로토콜을 통해 전송하십시오.

    +0

    JAXB를 직접 사용하면 서비스 엔드 포인트가 이해할 수 있도록 메시지의 XML 표현뿐만 아니라 완전한 SOAP 메시지도 필요하기 때문에 많은 노력이 필요합니다. 둘째, JAX-WS 런타임 우리가 탐험/재사용해서는 안되며, 바퀴를 다시 발명하는 것이 아닙니다. –