我想知道将@JsonIgnoreProperties(ignoreUnknown = true)
放在Java REST API中的位置。我有以下课程:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.map.ObjectMapper;
@JsonIgnoreProperties(ignoreUnknown = true)
public class QueuePayload {
private String message;
private String id;
public String getId() {
return this.id;
}
public String getMessage() {
return this.message;
}
public void setId(String id) {
this.id = id;
}
public void setMessage(String message) {
this.message = message;
}
public String serialize() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(this);
}
}
我在这样的JAX-RS servlet中使用它:
import javax.jms.JMSException;
import javax.naming.NamingException;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
@Path("/v1")
@Produces(MediaType.APPLICATION_JSON)
public class ServiceApiV1 {
@GET
public Response getApiRoot() {
String result = "{\"notice\" : \"It is alive!\"}";
return Response.status(Status.OK).entity(result).build();
}
@POST
@Path("/update")
@Consumes(MediaType.APPLICATION_JSON)
public Response update(UpdatePayload message) {
return Response.status(Status.OK).entity(message).build();
}
}
当我发布{ "message" : "Test", "id" : "one" }
时,它就像魅力一样,但当我发布{ "message" : "Test", "id" : "one", "sneaked" : "in" }
时,我得到了:
SRVE0315E: An exception occurred: com.ibm.ws.webcontainer.webapp.WebAppErrorReport: javax.servlet.ServletException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "sneaked"; (Class test.QueuePayload), not marked as ignorable at [Source: com.ibm.ws.webcontainer.srt.SRTInputStream@b7328421; line: 1, column: 7] (through reference chain: test.QueuePayload["sneaked"])
我虽然@JsonIgnoreProperties(ignoreUnknown = true)
完全是为这个用例而设计的。我也试过没有servlet中的属性和各种排列。我检查了this question,并确保在两个类中都导入了相同的API版本。
我想念什么?
更新
将导入的类别更改为codehouse(参见上文)并运行此测试):
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
QueuePayload qp = new QueuePayload();
qp.setPayload("PayLoad");
qp.setQueueId("ID-of-Q");
qp.setStatus("Some Status");
System.out.println(qp.serialize());
ObjectMapper om = new ObjectMapper();
QueuePayload qp2 = om.readValue("{\"payload\":\"PayLoad\",\"queueId\":\"ID-of-Q\",\"newstatus\":\"New Status\"}",
QueuePayload.class);
System.out.println(qp2.serialize());
}
那很有用。 servlet没有
答案 0 :(得分:1)
问题似乎是服务器使用Jackson 1.x(codehaus)。您正在尝试使用Jackson 2.x注释(fasterxml)。他们不互动。你可以通过异常来判断它是一个codehaus异常,这意味着旧的Jackson实际上是使用的。
您可以尝试在服务器中查找确切的版本,或者您可以尝试使用随机的1.x版本(当然在提供的范围内,没有冲突),就像这个
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
<scope>provided</scope>
</dependency>
然后在模型类(而不是资源类)上使用org.codehaus.jackson.annotate.JsonIgnoreProperties
。