带有 POJO 映射的 Jersey Rest Web 服务从 JSON 字符串中删除具有空值的字段 [已解决]

问题描述

我有一个 Jersey Rest Web 服务,我想发送 json 响应,从 json 响应中删除所有具有空值的字段。 我正在使用

@JsonInclude(JsonInclude.Include.NON_NULL) 

但它在类和属性级别都不起作用。

我的资源类包含这个函数

@RolesAllowed("ADMIN")
@Path("/test")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@ApiOperation(value = "test Create",response = TestResponse.class)
public Response Create(TestRequest request,@Context ContainerRequestContext context) {
   TestResponse resp = new TestResponse();
   resp.setValueA("Value A");
   return Response.ok().entity(resp).build();
}

TestResponse 类包含:

@ApiModel("TestResponse")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TestResponse{
   @JsonProperty
   private String valueA;
   @JsonProperty
   private String valueB;
   
   @ApiModelProperty(value = "Value A",example = "value A")
   public String getValueA(){
      return valueA;
   }
   public SetValueA(String valueA){
      this.valueA = valueA;
   }
   @ApiModelProperty(value = "Value B",example = "value B")
   public String getValueB(){
      return valueB;
   }
   public SetValueB(String valueB){
      this.valueB = valueB;
   }
}

我的 JSON 响应包含:

{"valueA":"ValueA","valueB":null}

但我想发回这个 JSON:

{"valueA":"ValueA"}

这是我的应用程序类:

    @ApplicationPath("/rest")
    public class App extends ResourceConfig {
       public App() {
          packages("it.ivan");
          // Register Auth Filter here
          register(AuthenticationFilter.class);
          register(StartupHandler.class);
          register(MultiPartFeature.class);
          register(new LoggingFeature(Logger.getLogger(LoggingFeature.DEFAULT_LOGGER_NAME),Level.INFO,LoggingFeature.Verbosity.PAYLOAD_ANY,10000));
          BeanConfig beanConfig = new BeanConfig();
          beanConfig.setTitle("Ivan Rest Application");
          beanConfig.setVersion("1.0.0");
          beanConfig.setBasePath("/rest/");
          beanConfig.setResourcePackage("it.ivan");
          beanConfig.setScan(true);
          register(beanConfig);
          register(io.swagger.jaxrs.listing.ApiListingResource.class);
          register(io.swagger.jaxrs.listing.SwaggerSerializers.class);      
          register(io.swagger.jaxrs.config.DefaultJaxrsConfig.class);

          Swagger swagger = new Swagger();
          swagger.securityDeFinition("basicAuth",new BasicAuthDeFinition());
          new SwaggerContextService().updateSwagger(swagger);

       }
    }

这是我的 pom.xml 文件

    <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>it.ivan</groupId>
<artifactId>TestRest</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>TestRest</name>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jersey.version>2.33</jersey.version>
    <slf4j.version>1.7.29</slf4j.version>
</properties>
<build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.1</version>
            <configuration>
                <warSourceDirectory>WebContent</warSourceDirectory>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>1.6</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20201115</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.5.13</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.4.0-b180830.0359</version>
    </dependency>
    <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-jersey2-jaxrs</artifactId>
        <version>1.6.2</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
</dependencies>

更新...问题已解决...

删除了这个依赖:

    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>1.6</version>
    </dependency>

添加了这个:

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey.version}</version>
    </dependency>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)