忽略jax-rs中的传入json元素

时间:2015-06-16 04:10:32

标签: json jaxb jax-rs

我想知道将@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没有

1 个答案:

答案 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