首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在@DataJpaTest中启用@Converter

在@DataJpaTest中启用@Converter
EN

Stack Overflow用户
提问于 2020-11-27 00:20:53
回答 1查看 278关注 0票数 1

我正在尝试通过JPA保存一个LocalDate。遵循这个指南:https://thorben-janssen.com/persist-localdate-localdatetime-jpa/我实现了一个转换器。

现在,这个功能运行得很好。

但是,我有几个用@DataJpaTest注释RepositoryTests,它们应该使用这个转换器。

现在这些都坏了。我得到了一些类似的东西

代码语言:javascript
复制
wrong column type encountered in column [...] in table [...]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]

显然,Converter并没有在@DataJpaTest的上下文中被提取和使用。我如何才能改变这一点?

正在讨论的可嵌入类:

代码语言:javascript
复制
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Embeddable
public class MyEntity {
    @Column
    private LocalDate dateToStore;
}

转换器:

代码语言:javascript
复制
@Converter(autoApply = true)
public class LocalDateConverter implements AttributeConverter<LocalDate, Date> {
   
    @Override
    public Date convertToDatabaseColumn(LocalDate locDate) {
        return locDate == null ? null : Date.valueOf(locDate);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date sqlDate) {
        return sqlDate == null ? null : sqlDate.toLocalDate();
    }

}

我使用的是Hibernate 5.4.20.Final With Spring Boot 2.3.3也是Liquibase,这是更改集:

代码语言:javascript
复制
<changeSet>   
    <addColumn tableName="tableName">
        <column name="DATE_TO_STORE" type="DATE"/>
    </addColumn>
</changeset>

中断测试很简单,它看起来就像这样:

代码语言:javascript
复制
@DataJpaTest
class MyRepositoryTest {

    @Autowired
    private MyRepository myRepository;

    @Test
    void save(){
        myRepository.save(new MyEntity());
    }
}

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-12-15 20:01:45

问题是@DataJpaTest不会扫描@Converter类,这在Spring Doc - Testing中可以看到

@WebMvcTest相关部分(工作正常):

要测试Spring MVC控制器是否按预期工作,请使用@WebMvcTest注释。@WebMvcTest自动配置Spring MVC基础设施,并将扫描的bean限制为@控制器、@ControllerAdvice、@JsonComponent、Converter、GenericConverter、Filter、WebMvcConfigurer和HandlerMethodArgumentResolver

其中as @DataJpaTest:

JPA您可以使用@DataJpaTest注解来测试

应用程序。缺省情况下,它会扫描@Entity类并配置Spring Data JPA存储库

这可能是Spring中的一个错误,因为在我看来,加载转换器应该总是与JPA测试相关(类似于这个commit)。

我的解决方法是在测试中手动加载转换器,方法是向测试中添加一个新的排除过滤器:

代码语言:javascript
复制
@DataJpaTest
@OverrideAutoConfiguration(enabled = true)
@TypeExcludeFilters(DataJpaTypeExcludeFilterWithConverter.class)
class SomeTest {
...
}

自定义过滤器:

代码语言:javascript
复制
public class DataJpaTypeExcludeFilterWithConverter extends StandardAnnotationCustomizableTypeExcludeFilter<DataJpaTest> {
        private static final Set<Class<?>> DEFAULT_INCLUDES;

        static {
            Set<Class<?>> includes = new LinkedHashSet<>();
            includes.add(Converter.class);
            includes.add(GenericConverter.class);
            try {
                includes.add(Module.class);
            }
            catch (Throwable ex) {
                // ignore
            }
            DEFAULT_INCLUDES = unmodifiableSet(includes);
        }

        protected DataJpaTypeExcludeFilterWithConverter(Class<?> testClass) {
            super(testClass);
        }

        @Override
        protected Set<Class<?>> getDefaultIncludes() {
            return DEFAULT_INCLUDES;
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65025746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档