[英]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.