2016-04-22 8 views
1

Der folgende Code verwendet den Jersey2-Client (v 2.22.2) mit der integrierten Moxy JSON-Unterstützung. Ich versuche, eine generierte Wrapper-Klasse in JSON zu marshallen. Wie Sie unten sehen können, wird die Eigenschaft json nicht wie vorgesehen entpackt.Problem beim Marshalling generisch mit Moxy und JerseyClient2

Wenn ich ändern Sie den Typ für die json Eigenschaft Service und ‚ungenerify‘ der Klasse alles funktioniert wie geplant, aber ich würde es vorziehen, um dies mit Generika zu tun, also muss ich nicht ein paar dieser Wrapper erstellen Klassen für jeden Typ, der auf diese Weise verpackt werden muss.

JSONWrapper.java

public class JSONWrapper<T> implements Serializable { 
    private T json; 

    public T getJson() { return this.json; } 
    public void setJson (T payload) { this.json = payload; } 

    public JSONWrapper() {} 
} 

Service.java

public class Service implements Serializable { 
    private String name; 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

MyClient.java

public class MyClient { 
    private Client jerseyClient; 

    public void createService(Service item) { 
    Invocation.Builder invocationBuilder = buildRequest(SERVICE_PATH); 
    JSONWrapper<Service> wrapper = new JSONWrapper<>(); 
    wrapper.setJson(item); 
    final Response response = invocationBuilder.post(Entity.entity(wrapper, MediaType.APPLICATION_JSON_TYPE)); 
    } 

    public MyClient() { 
    this.jerseryClient = ClientBuilder.newBuilder().build(); 
    } 

    public static void main(String[] args) { 
    MyClient myClient = new MyClient(); 
    Service myService = new Service(); 
    myService.setName("foo"); 
    myClient.createService(myService); 
    } 
} 

Mit dem Logging-Filter auf Ich drehte mich zu sehen, dass Moxy die Rangierung der Dinge aussieht so:

{ "json": "[email protected]"}

Als ich es aussehen soll so

{ "json": "{" name ": „foo“} "}

Antwort

1

Wegen Typ Löschung wird der generische Typ zur Laufzeit ausgelöscht, so moxy nicht den generischen Typen nicht kennt und spucken nur seine toString aus. Dies ist eine der Einschränkungen bei der Verwendung von MOXy (es beruht auf einigen JAXB-Funktionen). Um dies zu umgehen, hat JAX-RS die GenericEntity, die uns den generischen Typ umschließen lässt, so dass es Serialisierern bekannt ist.

JsonWrapper<Service> service = new JsonWrapper<>(); 
user.setJson(new Service("blah")); 
GenericEntity<JsonWrapper<Service>> entity 
     = new GenericEntity<JsonWrapper<Service>>(service){}; 
Response response = target("test").request().post(Entity.json(entity)); 

Von dem, was ich mit moxy nur getestet, aus irgendeinem Grunde spuckt es eine zusätzliche "type":"service" Eigenschaft im JSON aus. Ich bin mir nicht ganz sicher warum. Ich habe MOXy schon lange nicht mehr benutzt. Ich hatte zu viele Probleme damit. Persönlich würde ich empfehlen, zu Jackson zu wechseln. Mit Jackson wirst du dieses Problem nicht haben. Sie könnten mit nicht mit GenericEntity durchkommen, und es wird die Box ausarbeiten. Wenn Sie Maven verwenden, fügen Sie einfach die folgende Abhängigkeit und entfernen moxy

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>${jersey2.version}</version> 
</dependency> 

Wenn Sie nicht Maven verwenden, haben einen Blick auf this post.

+0

Danke, ich hatte mit GenericEntity gespielt, aber das funktioniert perfekt. – NBW