我正在尝试通过JPA保存一个LocalDate。遵循这个指南:https://thorben-janssen.com/persist-localdate-localdatetime-jpa/我实现了一个转换器。
现在,这个功能运行得很好。
但是,我有几个用@DataJpaTest注释RepositoryTests,它们应该使用这个转换器。
现在这些都坏了。我得到了一些类似的东西
wrong column type encountered in column [...] in table [...]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]显然,Converter并没有在@DataJpaTest的上下文中被提取和使用。我如何才能改变这一点?
正在讨论的可嵌入类:
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
@Embeddable
public class MyEntity {
@Column
private LocalDate dateToStore;
}转换器:
@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,这是更改集:
<changeSet>
<addColumn tableName="tableName">
<column name="DATE_TO_STORE" type="DATE"/>
</addColumn>
</changeset>中断测试很简单,它看起来就像这样:
@DataJpaTest
class MyRepositoryTest {
@Autowired
private MyRepository myRepository;
@Test
void save(){
myRepository.save(new MyEntity());
}
}提前感谢!
发布于 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)。
我的解决方法是在测试中手动加载转换器,方法是向测试中添加一个新的排除过滤器:
@DataJpaTest
@OverrideAutoConfiguration(enabled = true)
@TypeExcludeFilters(DataJpaTypeExcludeFilterWithConverter.class)
class SomeTest {
...
}自定义过滤器:
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;
}
}https://stackoverflow.com/questions/65025746
复制相似问题