[REST] Deserialisierung eines Object-Feldes

Herr-Herner

Mitglied
Hallo,
Leider gelingt es mir nicht mit Jersey ein Objekt-Feld zu deserialisieren, das bswp. einen String enthält. Hat jemand eine Ahnung, was ich tun kann, um das Problem zu lösen.

Hier mein Code:
Java:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ReturnValue{    
	
    private Object data;
    
    public ReturnValue() { }
    
    public ReturnValue(Object data) {
    	this.data = data;
    }
    
	public Object getData() {
		return data;
	}

	@Override
	public String toString() {
		return "ReturnValue [data=" + data + "]";
	}
    
}

Java:
public class MyClient {
	
	private String location = "http://localhost:9998/test";
	private Client client;
	private WebResource resource;
	
	public MyClient() {
		init();
	}
	
	private void init() {
	    ClientConfig clientConfig = new DefaultClientConfig();
	    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
	    client = Client.create(clientConfig);
	    resource = client.resource(location);
	}
	
	private void test() {
        ClientResponse response = resource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
        ReturnValue value = response.getEntity(ReturnValue.class);
        System.out.println(value);
	}
	
	public static void main(String[] args) {
		MyClient client = new MyClient();
		client.test();
	}
	
}

Java:
@Singleton
@Path("/test")
public class Test {
	
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Object get() {
		return Response.ok(new ReturnValue("TEST_SERVER")).build();
	}

}

Das seralisierte Objekt sieht wie folgt aus:
Code:
{"data":{"@type":"xs:string","$":"TEST_SERVER"}}

Als Ausgabe erhalte ich:
Code:
ReturnValue [data={@type=xs:string, $=TEST_SERVER}]

Anscheinend wird der String nicht deseralisiert, sondern einfach als Wert in die Variable
Code:
data
geschrieben. Was kann ich hier tun?
 
Leider ist der Anwendungsfall so... Innerhalb des
Code:
data
-Feldes müssen Objekte unterschiedlichen Types gehalten werden. Ich kann ledlich voraussetzen, dass es Integers, Strings, usw. oder aber mittels JAXB-serialisierbare Objekte sind.
 
Wenn data immer ein String ist, könntest du ja auch ein String-Property serialisieren anstatt dich hier mit den Einstellungen des Serializers zu plagen:

Java:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ReturnValue{    
    
    private String data;
    
    public ReturnValue() { }
    
    public ReturnValue(String data) {
        this.data = data;
    }

    public Object getData() {
        return data;
    }
 
    @Override
    public String toString() {
        return "ReturnValue [data=" + data + "]";
    }
    
}
 
Das geht - wie gesagt - leider nicht... Die Klasse ist ein generischer Daten-Container, der in der Lage sein muss, Objekte unterschiedlichen Typs aufzunehmen.
 
Dann muss auch die Deserialisierung generisch passieren.

Da wirst du etwas eingreifen müssen, die Typ-Information aus dem String herauslesen müssen und dann die entsprechende Deserialiserung anwenden.
 
Das wollte ich eigentlich umgehen... Interessant ist, dass wenn man anstelle von JSON auf beiden Seiten XML verwendet, funktioniert alles perfekt. Auch wenn ich die Klasse
Code:
ReturnValue
zu einer generischen Klasse mache, funktioniert es mit JSON nicht.
 

Zurück
Oben