自定义转换在 Spring Data jdbc 中不起作用

问题描述 投票:0回答:3

在讨论实际问题之前,让我简要介绍一下我正在寻找的内容。 我正在寻找加密和解密实体内部的字段。在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
}
java spring spring-boot spring-jdbc spring-data-jdbc
3个回答
0
投票

使您的配置扩展

AbstractJdcbcConfiguration
并覆盖
jdbcConfiguration()


0
投票

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

使您的配置扩展

AbstractJdcbcConfiguration
并覆盖
jdbcCustomConversions()
(或者可能
userConverters()
,如果适合目的)。


0
投票

你找到解决办法了吗?

© www.soinside.com 2019 - 2024. All rights reserved.