我无法使用带有 JSON 数据表示形式的 Jersey 来反序列化对象字段。 “数据”字段可以包含整数、字符串、字符串列表……或任何其他 JAXB 标记对象。
这是我的代码:
@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 + "]";
}
}
客户端如下所示:
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();
}
}
这就是资源:
@Singleton
@Path("/test")
public class Test {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Object get() {
return Response.ok(new ReturnValue("TEST_SERVER")).build();
}
}
序列化的对象看起来正确:
{"data":{"@type":"xs:string","$":"TEST_SERVER"}}
这是控制台上的输出:
ReturnValue [data={@type=xs:string, $=TEST_SERVER}]
如您所见,字符串未实例化。我可以做什么来解决我的问题?
最佳答案
问题是您在 ReturnValue
中使用 java.lang.Object
作为 data
的类型。因此,JAXB 会将结果与数据类型(实际上是 String
)一起编码,以便它知道如何在客户端解编您的对象。
以下代码使用您初始的ReturnValue
:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JAXB.marshal(new ReturnValue("cvb"), baos);
System.out.println(new String(baos.toByteArray()));
将产生此输出(请参阅 xsi:type="xs:string"):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<returnValue>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">cvb</data>
</returnValue>
,但如果将数据属性的类型更改为 String,由于 Jaxb 处理字符串和基元的方式,它看起来会像这样:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<returnValue>
<data>cvb</data>
</returnValue>
类似,你测试会输出:
TEST_SERVER
关于java - 如何在 Jersey 中反序列化对象字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12895065/