有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpringBoot@Convert不调用convertToDatabaseColumn方法

我想使用@Convert来加密我的数据库数据,下面是我的代码部分。 我遇到的问题是,当我设置@Converter(autoApply=true)时,它工作正常,并且所有的字符串属性都被完全加密。 但是当我将其设置为False时,我想要加密的属性不是加密的,并且永远不会调用convertToDatabaseColumn。 我错过了什么

实体类

@Entity
@Table(name="tbl_offer_log")
public class DbLogTable {

   @Column(name = "id", length=100)
   private int id;

   //Column I want to encrypt 
   @Column(name="msisdn",length=9)
   @Convert(converter = EncryptDecrypt.class)
   private String msisdn;
}

属性转换器

@Converter
public class EncryptDecrypt implements AttributeConverter<String, String> {

    private static SecretKeySpec secretKey;
    private static byte[] key;

    @Override
    public String convertToDatabaseColumn(String strToEncrypt) {
        try
        {
            String secret="secret";
            setKey("secret");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
        } 
        catch (Exception e) 
        {
        }
        return null;
    }
}

共 (2) 个答案

  1. # 1 楼答案

    找到了解决办法。 在getter和setter方法中使用@Convert,现在可以正常工作了

    @Convert(converter = EncryptDecrypt.class)
    public String getMsisdn() {
        return msisdn;
    }
    @Convert(converter = EncryptDecrypt.class)
    public void setMsisdn(String msisdn) {
        this.msisdn = msisdn;
    }
    
  2. # 2 楼答案

    你能像这样在实体类级别尝试@Converts,看看它是否适合你吗

    @Entity 
    @Converts({
                @Convert(attributeName="msisdn", 
                         converter=EncryptDecrypt.class)})
    @Table(name="tbl_offer_log")
    public class DbLogTable {
    
       @Column(name = "id", length=100)
       private int id;
    
       //Column I want to encrypt 
       @Column(name="msisdn",length=9)
       private String msisdn;
    }