【问题标题】:Customconversions not working in spring data jdbc自定义转换在 Spring Data jdbc 中不起作用
【发布时间】:2022-09-26 11:45:09
【问题描述】:

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

所以,我正在尝试使用 spring data jdbc 的 customconverstions 功能。在这里,我正在创建一种类型,如下所示

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


【解决方案1】:

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

【讨论】:

  • 我没有覆盖我正在定义所有 bean ...原因我想要这些带有限定符的 bean,因为我正在使用多个数据库
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2020-11-26
    • 2012-06-02
    • 2016-03-16
    • 2020-07-27
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多