2017-02-03 1 views
2

Das aktuelle Projekt, an dem ich gerade arbeite, besteht darin, eine Reihe von Webservices aus einer Java-Anwendung aufzurufen. Die Webservices werden auf einem Payara/Glassfish Server gehostet, der auf einer virtualisierten Linux Box läuft. Die Webservices geben Daten von zwei verschiedenen Legacy-Systemen zurück, eines basiert auf einer SQLServer-Datenbank und das andere auf einer FoxPro-basierten Datenbank.Ausnahme Webservice und Unmarshalling

Gelegentlich gibt der Webservice Daten zurück, die einen Wert (Byte) enthalten, der in der XML-Version 1.0 nicht zulässig ist, und die Anwendung gibt als Antwort eine Unmarshalling-Ausnahme mit ungültigem Zeichen (0x2) aus. Da ich keine Kontrolle über die Daten habe, die aus den Datenbanken abgerufen werden, muss ich eine Möglichkeit finden, das beanstandete Zeichen zu filtern/ersetzen, damit die Anwendung die Daten verwenden kann.

Ich habe Zugriff auf den Webservice-Code, damit ich bei Bedarf sowohl den Dienst als auch die Clients ändern kann. Ich habe irgendwo gelesen, dass xml Version 1.1 bestimmte Steuerzeichen erlaubt, aber ich bin mir nicht sicher, wie man diese Version oder sogar wo ich das tun würde.

Vorschläge?

Antwort

1

Wie bei diesem Tutorial (https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-2rd-edition/content/en/part1/chapter6/custom_marshalling.html), können Sie wahrscheinlich einen benutzerdefinierten Unmarshaller machen von readFrom von der Schnittstelle MessageBodyReader wie diese Umsetzung:

Object readFrom(Class<Object>, Type genericType, 
        Annotation annotations[], MediaType mediaType, 
        MultivaluedMap<String, String> httpHeaders, 
        InputStream entityStream) 
         throws IOException, WebApplicationException { 

     try { 
     JAXBContext ctx = JAXBContext.newInstance(type); 
     StringWriter writer = new StringWriter(); 
     IOUtils.copy(inputStream, writer, encoding); 
     String theString = writer.toString(); 
     // replace all special characters 
     theString = theString.replaceAll("[\u0000-\u001f]", ""); 
     return ctx.createUnmarshaller().unmarshal(theString); 
     } catch (JAXBException ex) { 
     throw new RuntimeException(ex); 
     } 
    } 
+0

versuchen, Ihren Beispielcode zu verwenden, und in dem Aufruf von unmarshal ich ein Fehler, da String kein auswertbarer Parameter ist. – kpenrose

+0

Korrigiert das Parameterproblem, und jetzt funktioniert der Leser. Scheint, ich muss auch etwas auf der Webservice-Seite tun, da der Server gelegentlich auch die Daten verschluckt. Der Fehler auf dieser Seite scheint jedoch ein wenig anders zu sein, da ein Timeout-Fehler beim Aufruf des Marshallers vorliegt. – kpenrose

Verwandte Themen