使用 RestEasy 处理没有'root'元素的 JSON 响应



我调用了一些Web服务(用Ruby构建(并得到这样的JSON响应:

{
"error_code": "02",
"message": "Param not valid",
"field_name": "title"
}

为了在 Java 中对该响应对象进行建模,我尝试使用:

import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "response")
public class Response {

private String error_code;
private String message;
private String field_name;

public String getError_code() {
return error_code;
}
public void setError_code(String error_code) {
this.error_code = error_code;
}

public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}

public String getField_name() {
return field_name;
}
public void setField_name(String field_name) {
this.field_name = field_name;
}

}

。并阅读我的 WS 客户端中 WS 调用的响应,我尝试:

Response response = responseWs.readEntity(Response.class);

。但我得到以下异常:

org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException: javax.xml.bind.UnmarshalException  - 有链接的例外: [com.sun.istack.internal.SAXParseException2; columnNumber: 0 意外元素...预期的元素是

这是因为我的代码正在尝试处理这样的 JSON 响应对象(带有一些"根"元素(:

{
"response":
{
"error_code": "02",
"message": "Param not valid",
"field_name": "title"
}       
}

有人知道我该如何解决这种情况吗?

谢谢

对我来说,这个片段解决了这个问题:

String responseAsString = responseWs.readEntity(String.class);
ObjectMapper mapper = new ObjectMapper();
JsonNode pathNode = mapper.readTree(responseAsString);
Response response = mapper.convertValue(pathNode, Response.class);

来自您发布的代码片段

响应

响应 = 响应Ws.readEntity(Response.class(;

我建议为您的实体对象使用其他名称。Response类也被Jaxrs框架本身使用。

我假设您正在使用RestEasyClient来调用此(外部(服务来接收 JSON。如果理解来自此服务的响应是 JSON 格式的,则可以使用 JSON (jackson( marshaller/unmarshaller 代替 JAXB。假设您的类路径上已经有可用的"resteasy-client"依赖项。此依赖项的 maven 形式如下所示:

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.19.Final</version>
</dependency>
  1. 将 DTO 的名称更改为ExternalServiceResponse
  2. 执行请求时GET显式指定响应媒体类型
Response response = target.request(MediaType.APPLICATION_JSON).get();
ExternalServiceResponse result = response.readEntity(ExternalServiceResponse.class)
  1. 最后我不明白为什么你需要在 DTO 上指定@XmlRootElement注释
public class ExternalServiceResponse implements Serializeable {
private String error_code;
private String message;
private String field_name;
public String getError_code() {
return error_code;
}
public void setError_code(String error_code) {
this.error_code = error_code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getField_name() {
return field_name;
}
public void setField_name(String field_name) {
this.field_name = field_name;
}
}

在那里配置JAXB(属性文件或配置方法(,您应该在其中设置jaxbUnmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false)

最新更新