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

Spring boot Spring启动/Spring数据。如何使用包含未编码数据的data.sql用编码数据填充数据库,spring-boot,h2,spring-data-rest,Spring Boot,H2,Spring Data Rest,我正在用SpringDataREST编写某种“HelloWorld”REST服务 我有一个简单的@Entity类: @实体 公共类用户{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) 私人长id; 私有字符串名; 私有字符串lastName; @时间(日期) 私人生日; 私人字符串电子邮件; @列(长度=60) @JsonDeserialize(使用=BCryptPasswordDeserializer.class) 私有字符串密码; //接球

我正在用SpringDataREST编写某种“HelloWorld”REST服务

我有一个简单的@Entity类:

@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串名;
私有字符串lastName;
@时间(日期)
私人生日;
私人字符串电子邮件;
@列(长度=60)
@JsonDeserialize(使用=BCryptPasswordDeserializer.class)
私有字符串密码;
//接球手和接球手
}
如您所见,密码字段上方有一个@JsonDeserialize,所以任何来自客户机的密码在进入数据库之前都使用BCryptPasswordEncoder进行编码。顺便说一句,我正在使用H2 im内存数据库

BCryptPasswordDeserializer的实现:

公共类BCryptPasswordDeserializer扩展JsonDeserializer{
@凌驾
公共字符串反序列化(JsonParser jp,反序列化上下文dc)引发IOException,JsonProcessingException{
ObjectCodec oc=jp.getCodec();
JsonNode=oc.readTree(jp);
BCryptPasswordEncoder编码器=新的BCryptPasswordEncoder();
字符串encodedPassword=encoder.encode(node.asText());
返回编码密码;
}        
}
我的资源中还有data.sql:


这就是我的“问题”:在插入表之前,我需要对这个文件中的密码进行编码。有办法吗?或者Spring中有一些不同的方法来填充数据库,允许在插入数据之前使用加密逻辑?

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

大概是这样的:

@Component
class UserCreator {

    @Autowired
    private UserRepository userRepository;

    @PostConstruct
    public void init() {
        userRepository.save(new User('Ivan', 'Ivanov', '1990-01-01', 'i.ivanov@test.test', '123567'));
        // etc
    }
}

要控制是否使用
UserCreator
(您可能不希望在生产环境中这样做),可以向类添加
@Profile
注释。或者仅当
用户
数据库表为空时插入数据。。。(或您想要的任何条件)。

1234567->2a$04$RZsL0kD/VHS0UUU2MAQA86OK1H08A18/78aooPcZ1zuLVH0TuWszkG@Cepr0谢谢,但我不想硬编码:)你已经这么做了。@Cepr0好吧,是的,假设这只是暂时的解决方案。也许在Spring中有一些不同的方法来填充数据库,允许在插入数据之前使用加密逻辑?谢谢!这正是我所需要的,只是它必须是新的BCryptPasswordEncoder().encode(“123456”)而不是简单的“123456”,而且出于某种原因,@Entity类中必须有一个空构造函数。没有它,甚至客户端的密码都不会编码。在生产环境中,您将如何做到这一点?
@Component
class UserCreator {

    @Autowired
    private UserRepository userRepository;

    @PostConstruct
    public void init() {
        userRepository.save(new User('Ivan', 'Ivanov', '1990-01-01', 'i.ivanov@test.test', '123567'));
        // etc
    }
}