我正在重构Spring Boot 2.3.1应用程序的一部分,在该应用程序中,以前的开发人员在代码中到处都使用Integer类型(值为0或1(而不是布尔型。
但我注意到了一些我没有想到的事情:我还更改了实体类中的字段类型,当从DB加载它时,我得到了一个错误:
[2021-05-04T22:27:36.036Z] [main] [24] [ERROR] Parameter value [0] did not match expected type [java.lang.Boolean (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [0] did not match expected type [java.lang.Boolean (n/a)]
org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [0] did not match expected type [java.lang.Boolean (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [0] did not match expected type [java.lang.Boolean (n/a)]
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:257)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:149)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy247.findByTicketIdAndInternalComment(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205)
at com.sun.proxy.$Proxy162.findByTicketIdAndInternalComment(Unknown Source)
当使用H2运行现有测试时,会发生这种情况。
Liquibase在测试启动时创建的字段是:
INTERNAL_COMMENT BOOLEAN DEFAULT TRUE
我的领域曾经是:
private Integer internalComment;
它正在发挥作用。
现在是:
private Boolean internalComment;
但它不起作用。
在orm.xml中,我有一个简单的映射:
<basic name="internalComment">
<column name="INTERNAL_COMMENT" nullable="true" />
</basic>
我的存储库类是:
public interface JpaCommentEntityRepository
extends CrudRepository<TicketCommentEntity, Long>, JpaSpecificationExecutor<TicketCommentEntity>
我尝试了几种方法(使Java字段变为布尔字段,而不是布尔字段,用各种类型(如NUMBER(1,0((声明列(,但都无济于事。。。
唯一有效的方法是,当我改回Integer,并在从entit类创建域对象时执行手动映射到boolean。。所以,至少,我确信这是造成问题的领域,而不是其他什么。
因此,在某种程度上,我的重构已经在改进代码:字段不是布尔值的唯一地方是在实体类中。。但它迫使be为映射添加额外的代码。。。这应该直接起作用,对吧?
所以我想我错过了一些东西,但我已经没有办法调查/解决这个问题了。
任何帮助都将不胜感激,谢谢!
在CrudRepository中有一种方法:
@Nonnull
List<TicketCommentEntity> findByTicketIdAndInternalComment(long ticketId, Integer internalComment);
需要将其字段类型更改为布尔值:
@Nonnull
List<TicketCommentEntity> findByTicketIdAndInternalComment(long ticketId,boolean internalComment);
这就是错误消息的内容!