默认情况下,不要使用Spring Data Rest和Jpa公开Entity类中的字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了默认情况下,不要使用Spring Data Rest和Jpa公开Entity类中的字段相关的知识,希望对你有一定的参考价值。

我有一个实体类帐户。它有很多字段。其中大部分现在暴露在REST调用中,除非我明确忽略@JsonIgnore的密码字段,但我将添加更多字段,我不想忘记将@JsonIgnore添加到不应公开的新内容中。

我可以反转曝光,因此我明确必须启用要导出的字段,默认情况下它不会被曝光吗?

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import lombok.Data;
import lombok.ToString;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Data
@ToString(exclude = "password")
@Entity
public class Account {

    public static final PasswordEncoder PASSWORD_ENCODER = new BCryptPasswordEncoder();

    private @Id @GeneratedValue Long id;

    private String name;

    @JsonIgnore private String password;

    private String[] roles;

    public void setPassword(String password) {
        this.password = PASSWORD_ENCODER.encode(password);
    }

    protected Account() {}

    public Account(String name, String password, String... roles) {

        this.name = name;
        this.setPassword(password);
        this.roles = roles;
    }

}

在这里使用Spring Data REST,所以其他所有东西都只是存储库,没有额外的层来做一些聪明的事情。

答案

Jackson库中有两种主要方法可以获得“白名单”属性效果

第一种方式:

@Data类中删除Account注释,并仅将getters添加到要公开的字段。为了确保没有getter的属性不会被排除在你的@JsonIgnoreProperties(ignoreUnknown=true)类中添加Account

第二种方式:

Account课程包装你的AccountForJson课程。例如 :

public class AccountForJson {

private Account account;

public MyClassForJson(Account accountToWrapped) {
    this.account = accountToWrapped;
}

/**
 * Example of property that you want to expose
 */
public String getName() {
    return this.account.getName();
 }
}

p.s:qazxsw poi github存储库中存在一个未解决该功能的问题,这里是观看该问题的链接 - Jackson

以上是关于默认情况下,不要使用Spring Data Rest和Jpa公开Entity类中的字段的主要内容,如果未能解决你的问题,请参考以下文章

默认情况下,不要打印类实例的所有插槽

Spring Data JPA 之 原生SQL使用

在没有 Spring Boot 应用程序的情况下使用 Spring Data JPA

如何在不使用离子的this.navCtrl.push(PostPage,data)的情况下将数据传递到另一个页面

使用 Spring Data Rest 时公开所有 ID

如何配置两个实例mongodb使用spring boot和spring data