如何忽略Jersey Rest中JSON对象的属性编辑

Dha*_*ana 6 java rest

作为我的要求的一部分,我公开了一个Web服务,它将Employee类作为JSON格式的输入.员工类如下.如果您看到类中有3个属性,如status,password,creationTime.现在我试图阻止用户提供status和creationTime等属性.我的意思是说我不想让用户输入JSON: -

{
  "emp_id": "xyz@gmail.com",
  "credentials" : {"password": "xxxxx"},
  "status": "ACTIVE",
  "creationTime": "<UTC time>"
}
Run Code Online (Sandbox Code Playgroud)

输入status和creationTime时,应该会产生400错误消息.同样,当我向用户显示结果时,return Response.status(Status.ACCEPTED).entity(employee).build();它不应显示creationTime或凭据.它应该看起来像: -

 {
      "emp_id": "xyz@gmail.com",
      "status": "ACTIVE",
    }
Run Code Online (Sandbox Code Playgroud)

我可以看到有一个@JsonIgnore属性在我的情况下不适用于状态.我试过杰克逊.

我的员工类如下:

import java.util.Date;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;

@XmlRootElement
public class Employee {
    @XmlElement(name = "emp_id", required = true)
    @JsonProperty("emp_id")
    private String empId;
    private Credentials credentials;
    private String status;
    private Date creationTime;

    public String getEmpId() {
        return empId;
    }

    public void setEmpId(String empId) {
        this.empId = empId;
    }

    public Credentials getCredentials() {
        return credentials;
    }

    public void setCredentials(Credentials credentials) {
        this.credentials = credentials;
    }

    @JsonIgnore
    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Date getCreationTime() {
        return creationTime;
    }

    public void setCreationTime(Date creationTime) {
        this.creationTime = creationTime;
    }

}
Run Code Online (Sandbox Code Playgroud)

cas*_*lin 2

Jersey 默认 JSON 提供程序

来自泽西岛文档

自 Jersey 2.0 以来,通过 MOXy 提供的 JSON 绑定支持是 Jersey 应用程序中支持 JSON 绑定的默认且首选方式。当 JSON MOXy 模块位于类路径上时,Jersey 将自动发现该模块并通过应用程序中的 MOXy 无缝启用 JSON 绑定支持。

由于MOXy支持JAXB 注释,因此请尝试使用@XmlTransient. 它应该可以解决问题。

使用 Jackson 作为 JSON 提供者

要使用 Jackson 2.x 作为 JSON 提供程序,您需要将jersey-media-json-jackson模块添加到您的pom.xml文件中:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.22.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

要使用 Jackson 1.x,您需要以下jersey-media-json-jackson1模块:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson1</artifactId>
    <version>2.22.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

有关依赖项的更多信息,请查看Jersey 文档

如果可以,请选择 Jackson 2.x 而不是 Jackson 1.x。

将 Jackson 注册为 JSON 提供者

为了使用 Jackson 作为 JSON 提供程序,您需要在您的类(Jersey 自己的类实现)中注册JacksonFeatureJackson 2.x(或Jackson1FeatureJackson 1.x):ResourceConfigApplication

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(JacksonFeature.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看文档

选择正确的JsonProperty注释

JsonProperty确保您根据 Jackson 版本使用正确的注释:

有关注释的更多详细信息,请查看文档:

尝试注释您的字段

此外,不要对getStatus()方法进行注释,而是尝试status使用正确的@JsonProperty注释对字段进行注释。