我调用了一些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>
- 将 DTO 的名称更改为
ExternalServiceResponse
- 执行请求时
GET
显式指定响应媒体类型
Response response = target.request(MediaType.APPLICATION_JSON).get();
ExternalServiceResponse result = response.readEntity(ExternalServiceResponse.class)
- 最后我不明白为什么你需要在 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)