2015-05-08 3 views
7

Ich entwickle einen Java-Webdienst. In diesem Moment kann ich Http Header Anfragen bekommen. Aber ich möchte mehr Header-Anfragen hinzufügen.Hinzufügen von HTTP-Headern zur JAX-WS-Dienstantwort

Ich mache dies derzeit in einem Servlet-Filter.

Das Problem mit dieser Strategie ist, dass der hinzugefügte Header statisch ist.

Mit SoapHandler Klasse kann ich eine SOAP-Nachricht erhalten - dynamisch:

public class SoapClass implements SOAPHandler<SOAPMessageContext> { 


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

    @Override 
    public Set<QName> getHeaders() { 
     Set<QName> qNames = Collections.EMPTY_SET; 
     return qNames; 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext messageContext) { 
     log(messageContext); 
     return true; 
    } 

    @Override 
    public void close(MessageContext context) { 
    } 


    public static String getMsgAsString(SOAPMessage message) { 
     String msg = null; 
     try { 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      message.writeTo(baos); 
      msg = baos.toString(); 
     } catch (SOAPException | IOException soape) { 
     } 
     return msg; 
    } 


    private String soapToString(SOAPMessage message, boolean indent) { 
     final StringWriter sw = new StringWriter(); 

     try { 
      TransformerFactory.newInstance().newTransformer().transform(
        new DOMSource(message.getSOAPPart()), 
        new StreamResult(sw)); 
     } catch (TransformerException e) { 
      throw new RuntimeException(e); 
     } 

     return (indent ? sw.toString() : sw.toString().replaceAll("[\\r\\n]", "")); 
    } 

Also, was ich wirklich wollte, war mit Filter dynamische Seife Nachricht zu verbinden. Wie kann ich das erreichen?

+0

Was meinst du mit „der Header statisch“? Was ist ein statischer Header im Vergleich zu einem dynamischen Header? – kolossus

+0

"Operation", "etwas" ist eine Wert-Statistik, die ich definiert habe. Ich möchte verschiedene Soap Content für jede Anfrage in der Lage sein – Goldbones

+0

Ich verstehe es immer noch nicht Mann: Was ist ein "Wert statisch" vs "Seife Inhalt"? Möchten Sie einen HTTP-Header basierend auf einer Bedingung festlegen? Oder möchten Sie einen SOAP-Header festlegen? * Ich möchte unterschiedliche Soap-Inhalte für jede Anfrage * wirklich nicht gut übersetzen können. Kannst du eine Illustration oder etwas posten? – kolossus

Antwort

6

Während ich noch nicht ganz klar bin, was Sie wirklich wollen, werde ich beschreiben, wie HTTP-Header in einer SOAP-Web-Service-Antwort hinzugefügt werden. Der sauberste Ort, um dies zu tun, ist in einem JAX-WS-Handler, nicht anders als das, was Sie bereits in Form von SoapClass haben.

Um dies in Ihrem SOAPHandler zu tun, müssen Sie zuerst Zugriff auf die Liste der Header im zugrunde liegenden HttpServletResponse erhalten. Diese Liste wird von der SOAPMessageContext bereitgestellt:

@Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     //This property checks whether the handler is being invoked for a service response 
     boolean response= ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue(); 

     if (response) { 
      //this is a JAX-WS-provided map of HTTP headers 
      Map<String, List<String>> headers = (Map<String, List<String>>) context.get(MessageContext.HTTP_RESPONSE_HEADERS); 
      if (null == headers) { 
       //create a new map of HTTP headers if there isn't already one 
       headers = new HashMap<String, List<String>>(); 
      } 
      //add your desired header 
      headers.put("Operation",Collections.singletonList("something"); 
     } 
     return true; 
    } 

Ein alternativer Ansatz ist die HttpServletResponse zuzugreifen, die die Web-Service-Antwort zugrunde liegen hat:

 @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     //This property checks whether the handler is being invoked for a service response 
     boolean response= ((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue(); 

     if (response) { 
      //this is underlying http response object 
      HttpServletResponse response = (HttpServletResponse) context.get(MessageContext.SERVLET_RESPONSE); 

      //add your desired header 
      response.addHeader("Operation", "something"); 
      } 
     return true; 
    } 
+0

Ich habe diesen Ansatz vorher versucht. Ich erhalte eine Ausnahme - request.headers ist eine schreibgeschützte Eigenschaft. – Goldbones

+0

Mein Fehler @Goldbones; Es sollte 'HTTP_RESPONSE_HEADERS' nicht' HTTP_REQUEST_HEADERS' sein. Ich habe auch einen alternativen Ansatz gepostet. Der Ansatz, den Sie bereits ausprobiert haben, sollte immer Teil Ihrer Frage sein: spart jeder Zeit und sorgt für eine bessere Frage. – kolossus

+0

Perfekt! Genau das, was ich wollte. Ich habe das in einem anderen Beitrag getan, aber niemand konnte eine angemessene Antwort geben. In Code, den Sie bereitstellen, anstelle von statischem Inhalt ("etwas" wird immer die gleiche Antwort in verschiedenen Anfragen sein) Ich habe dynamischen Inhalt (durch Soap-Message-Kontext), was großartig ist, weil ich jetzt verschiedene Nachrichten für verschiedene Anfragen habe. Vielen Dank! – Goldbones

Verwandte Themen