spring-boot - Spring Boot/Spring 数据。如何使用包含未编码数据的 data.sql 用编码数据填充数据库

标签 spring-boot h2 spring-data-rest

我正在使用 Spring Data Rest 编写某种“hello-world”REST 服务。

我有一个简单的@Entity类:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;    
    private String firstName;
    private String lastName;
    @Temporal(DATE)
    private Date birthDate;
    private String email;
    @Column(length = 60)
    @JsonDeserialize(using = BCryptPasswordDeserializer.class)    
    private String password;
    // getters and setters
    }

如您所见,密码字段上方有一个 @JsonDeserialize,因此来自客户端的任何密码在进入数据库之前都会使用 BCryptPasswordEncoder 进行编码。顺便说一句,我正在使用 H2 内存数据库。

BCryptPasswordDeserializer 的实现:

public class BCryptPasswordDeserializer extends JsonDeserializer<String> {
    @Override
    public String deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
        ObjectCodec oc = jp.getCodec();
        JsonNode node = oc.readTree(jp);
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        String encodedPassword = encoder.encode(node.asText());
        return encodedPassword;
    }        
}

我的资源中还有 data.sql:

insert into user (id, first_name, last_name, birth_date, email, password)
values (1, 'Ivan', 'Ivanov', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="086126617e6966677e487c6d7b7c267c6d7b7c" rel="noreferrer noopener nofollow">[email protected]</a>', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(2, 'Petr', 'Petrov', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="aede80decbdadcc1d8eedacbddda80dacbddda" rel="noreferrer noopener nofollow">[email protected]</a>', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(3, 'John', 'Cena', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="412b6f22242f2001352432356f35243235" rel="noreferrer noopener nofollow">[email protected]</a>', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(4, 'Michael', 'Moore', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e68bc88b89899483a692839592c892839592" rel="noreferrer noopener nofollow">[email protected]</a>', '123567');
insert into user (id, first_name, last_name, birth_date, email, password)
values(5, 'Trevor', 'Fassbender', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f185df9790828293949f959483b185948285df85948285" rel="noreferrer noopener nofollow">[email protected]</a>', '123567');

这就是我的“问题”:我需要一些东西,在插入表之前也能对该文件中的密码进行编码。有什么办法可以做到这一点吗?或者也许Spring中有一些不同的方式来填充数据库,允许在插入数据之前使用加密逻辑?

最佳答案

我将创建 Spring 组件,该组件使用存储库在启动后插入数据。

类似这样的事情:

@Component
class UserCreator {

    @Autowired
    private UserRepository userRepository;

    @PostConstruct
    public void init() {
        userRepository.save(new User('Ivan', 'Ivanov', '1990-01-01', '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1f763176697e7170695f6b7a6c6b316b7a6c6b" rel="noreferrer noopener nofollow">[email protected]</a>', '123567'));
        // etc
    }
}

要控制是否使用UserCreator(您可能不想在生产环境中执行此操作),您可以添加一个@Profile注释类。或者,仅当 User 数据库表为空时才插入数据...(或您想要的任何条件)。

关于spring-boot - Spring Boot/Spring 数据。如何使用包含未编码数据的 data.sql 用编码数据填充数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49322587/

相关文章:

java - Springboot data-jpa findByDate()

database - 在哪里将 -ifNotExists 标志添加到 h2 start 命令?

spring-boot - Spring H2 测试数据库在每次测试前不会重置

java - 如何将文件上传集成到 Spring Data REST 存储库中?

java - 在 Spring Data 中为同一 QueryDSL 路径创建多个别名

java - Minikube/kubernetes pod 无法连接到 Mongodb Atlas

java - Spring Boot 应用程序中的动态数据库重新配置

java - Spring 数据在生产中休息

java - 有没有办法在测试类之前重新加载 application.yml ?

h2 - 从 DbVisualizer 连接到 H2 服务器