繁体   English   中英

自定义转换在 spring 数据 jdbc 中不起作用

[英]Customconversions not working in spring data jdbc

在讨论实际问题之前,让我简要介绍一下我在寻找什么。 我正在寻找加密和解密实体内的字段。 在 JPA 中,我们可以使用属性转换器来实现这一点。 但在 spring 数据 jdbc 中,它似乎不受支持。

所以,我正在尝试使用 spring 数据 jdbc 的自定义转换功能。 在这里,我正在创建一种类型,如下所示

import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class EncryptionDataType {
  private String value;

  @Override public String toString() {
    return value ;
  }
}

在 Pojo 中,我将使用这种类型作为字段。

@Table("EMPLOYEE")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Data
public class Employee
{
    @Column("name")
    private EncryptionDataType name;
    @Id
    private Integer id;
    @Version
    private Long version;

}

所以从这里我希望将“EncryptionDataType”保存为 mysql 中的普通字符串列,为此我创建了用于读写的转换器

@WritingConverter
public class EncryptionDataTypeWriteConverter implements Converter<EncryptionDataType, String> {
  @Override public String convert(EncryptionDataType source) {
    return source.toString()+"add";
  }
}
@ReadingConverter
public class EncryptionDataTypeReadConverter implements Converter<String, EncryptionDataType> {

  @Override public EncryptionDataType convert(String source) {
    return new EncryptionDataType(source);
  }
}

在配置文件中配置这些转换。

@Configuration
public class MyConfig {

@Bean
    protected JdbcCustomConversions JdbcConversion(Dialect dialect) {
            return new JdbcCustomConversions(
                Arrays.asList(new EncryptionDataTypeReadConverter(),new EncryptionDataTypeWriteConverter()));
    }
}

这种配置似乎不起作用。 我得到以下错误。

PreparedStatementCallback; bad SQL grammar [INSERT INTO `encryption_data_type` (`name`, `value`) VALUES (?, ?)]; nested exception is java.sql.SQLSyntaxErrorException: Table 'testschema.encryption_data_type' doesn't exist

似乎不是将我的加密数据类型转换为字符串,而是尝试插入新表。 请帮我。 我错过了什么吗?

更新配置代码:

@Configuration
@EnableJdbcRepositories(transactionManagerRef = "CustomJdbcTranasactionManager", jdbcOperationsRef = "CustomJdbcOperationsReference", repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class, basePackages = {
    "com.java.testy"
})
@EnableAutoConfiguration(exclude = {
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class,
    org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration.class
})
public class MyConfig {

@Bean
    protected JdbcCustomConversions JdbcConversion(Dialect dialect) {
            return new JdbcCustomConversions(
                Arrays.asList(new EncryptionDataTypeReadConverter(),new EncryptionDataTypeWriteConverter()));
    }
// creating beans for datasource,JdbcOperationsReference,JdbcTranasactionManager,JdbcConverter,JdbcMappingContext,DataAccessStrategy,JdbcAggregateTemplate
}

使您的配置扩展AbstractJdcbcConfiguration并覆盖jdbcConfiguration()

只是更新 Jens Schauder 的答案(我认为这只是一个错字 - 我会发表评论但没有代表):

使您的配置扩展AbstractJdcbcConfiguration并覆盖jdbcCustomConversions() (或者可能是userConverters() ,如果适合目的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM