如何让jsonIgnore能够设置值

How to make jsonIgnore be able to setvalue

提问人:ksernow 提问时间:11/1/2023 更新时间:11/1/2023 访问量:25

问:

Spring Boot 2.7.8 (英语)

我有一个简单的 POJO 叫做参与者。前端发送一个 API 请求,其中包含我要存储在数据库中的字段 IP。但是,在后端,我将此字段设置为空。我将此字段标记为 jsonIgnore 的原因是因为我不希望此字段包含在有效的 get API 响应中。我在响应中没有看到此字段,但在初始 API 中,该字段被映射为 null,因此我无法存储它。

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table(name="participant")
public class Participant {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long participantId; 
    private String ip;
    

    public void setIp(String ip) {
        this.ip = ip;
    }

    @JsonIgnore
    public String getIp(){return this.ip;}
    
}

REST控制器

@RequestMapping(value = "api/test", method = RequestMethod.POST)
    public ResponseEntity<?> addParticipant(@RequestBody Participant p) {
        .....

}

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>master</groupId>
    <artifactId>hype</artifactId>
    <version>0.1</version>
    <packaging>war</packaging>
    <name>hype</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>20</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.7.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

    </dependencies>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8</version>
        <relativePath />
    </parent>
    

</project>

前端 API 有效负载包含字段值

{
ip : "172.1.1.1"
}

但在后端它的 null

{
ip: null
}
java spring-boot jackson-databind

评论


答:

1赞 Dat Nguyen 11/1/2023 #1

@JsonIgnore在字段级别用于标记要忽略的属性或属性列表。:)

采用系统设计。不应将实体用于请求/响应 dto。为了系统安全,您应该提供一个请求/响应 dto,然后将 dto 映射(在业务逻辑之后)与实体,然后将数据保存到 DB 中。(适配器设计模式)

这种方式的优点:

  • 你控制 dto( 不是实体)。
  • 您可以处理数据(验证、传输....)
  • FE 只能知道 BE 提供的字段
  • 在实体中添加/删除列时,FE 不需要编辑

评论

0赞 ch4mp 11/1/2023
同意。此外,如果 GET 有效负载与 POST 有效负载不同,则应为两者使用不同的 DTO。最后,如果有效负载中的 IP 是发送请求的设备之一,则应从请求本身读取 IP,而不是信任客户端将其作为有效负载的一部分提供。