在讨论实际问题之前,让我简要介绍一下我正在寻找的内容。 我正在寻找加密和解密实体内部的字段。在JPA中,我们可以使用属性转换器来实现这一点。但在 spring data jdbc 中似乎不支持它。
所以,我正在尝试使用 Spring Data 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()
,如果适合目的)。
你找到解决办法了吗?