Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从H2数据库以布尔/布尔形式读取TINYINT值时获取MappingException_Java_Spring Boot_H2_Spring Webflux_Spring Data R2dbc - Fatal编程技术网

Java 从H2数据库以布尔/布尔形式读取TINYINT值时获取MappingException

Java 从H2数据库以布尔/布尔形式读取TINYINT值时获取MappingException,java,spring-boot,h2,spring-webflux,spring-data-r2dbc,Java,Spring Boot,H2,Spring Webflux,Spring Data R2dbc,我使用R2DBCH2集成测试我的反应式应用程序(基于SpringWebFlux,Java) 版本 驱动程序:io.r2dbc:r2dbc-h2:0.8.4.RELEASE(Spring boot 2.3.2.RELEASE) 爪哇:11 操作系统:Mac 我有一个定义如下的表: @Table("prep_task") public class PrepTaskEntity implements Persistable<Long> { // .....

我使用R2DBCH2集成测试我的反应式应用程序(基于SpringWebFlux,Java)

版本

  • 驱动程序:io.r2dbc:r2dbc-h2:0.8.4.RELEASE(Spring boot 2.3.2.RELEASE)
  • 爪哇:11
  • 操作系统:Mac
我有一个定义如下的表:

@Table("prep_task")
public class PrepTaskEntity implements Persistable<Long> {

    // .....

    @Column("is_active")
    private Byte isActive;

    // .....

    public boolean isActive() {
        return isActive != null && isActive != 0;
    }

    public void setActive(boolean active) {
        isActive = (byte) (active ? 1 : 0);
    }

    // .....

}
CREATE TABLE`prep_task`(
`序列号,
`外部_id`VARCHAR(45)不为空,
`name`VARCHAR(45)不为空,
`description`VARCHAR(100)NULL,
`是不是很活跃,
主键(`id`)
);
和相应实体:

@表格(“准备任务”)
公共类PrepTaskEntity实现持久化{
@身份证
@列(“id”)
私人长id;
@列(“外部id”)
私有字符串外部化;
@列(“名称”)
私有字符串名称;
@列(“说明”)
私有字符串描述;
@列(“是否处于活动状态”)
私有布尔非活动;
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getExternalId(){
回报外部化;
}
公共void setExternalId(字符串externalId){
this.externalId=externalId;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getDescription(){
返回说明;
}
公共void集合描述(字符串描述){
this.description=描述;
}
公共布尔isActive(){
回报是积极的;
}
public void setActive(布尔激活){
i活跃=活跃;
}
@凌驾
public boolean isNew(){
返回id==null;
}
}
保存
PrepTaskEntity
时没有问题,但尝试读取时,出现以下错误

org.springframework.data.mapping.MappingException: Could not read property @org.springframework.data.relational.core.mapping.Column(value="is_active")private java.lang.Boolean com.example.demosvc.persistence.entities.PrepTaskEntity.isActive from result set!
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.readFrom(MappingR2dbcConverter.java:172) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ⇢ Handler com.example.demosvc.controllers.PrepTaskController#getPrepTasksForGivenBU(String) [DispatcherHandler]
    |_ checkpoint ⇢ com.example.demosvc.filters.TenancyContextFilter [DefaultWebFilterChain]
    |_ checkpoint ⇢ HTTP GET "/sites/BU-002/prepTasks" [ExceptionHandlingWebHandler]
Stack trace:
        at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.readFrom(MappingR2dbcConverter.java:172) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
        at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.read(MappingR2dbcConverter.java:133) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
        at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.read(MappingR2dbcConverter.java:116) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
        at org.springframework.data.r2dbc.convert.EntityRowMapper.apply(EntityRowMapper.java:46) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
        at org.springframework.data.r2dbc.convert.EntityRowMapper.apply(EntityRowMapper.java:29) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
        at io.r2dbc.h2.H2Result.lambda$map$0(H2Result.java:67) ~[r2dbc-h2-0.8.4.RELEASE.jar:0.8.4.RELEASE]
        at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100) ~[reactor-core-3.3.8.RELEASE.jar:3.3.8.RELEASE]
        at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:73) ~[reactor-core-3.3.8.RELEASE.jar:3.3.8.RELEASE]
...
Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Byte] to type [java.lang.Boolean]
    at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:321) ~[spring-core-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:194) ~[spring-core-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:174) ~[spring-core-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.getPotentiallyConvertedSimpleRead(MappingR2dbcConverter.java:263) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.readValue(MappingR2dbcConverter.java:187) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.readFrom(MappingR2dbcConverter.java:169) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.read(MappingR2dbcConverter.java:133) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
    at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.read(MappingR2dbcConverter.java:116) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
    at org.springframework.data.r2dbc.convert.EntityRowMapper.apply(EntityRowMapper.java:46) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
    at org.springframework.data.r2dbc.convert.EntityRowMapper.apply(EntityRowMapper.java:29) ~[spring-data-r2dbc-1.1.2.RELEASE.jar:1.1.2.RELEASE]
    at io.r2dbc.h2.H2Result.lambda$map$0(H2Result.java:67) ~[r2dbc-h2-0.8.4.RELEASE.jar:0.8.4.RELEASE]
仅供参考,我正在使用MySQL作为H2的连接模式

@配置
@配置文件(应用程序.配置文件.集成测试)
公共类H2ConnectionConfig扩展了AbstractR2dbcConfiguration{
私人最终R2dbcConfigProperties R2dbcConfigProperties;
@自动连线
公共H2连接配置(R2dbcConfigProperties R2dbcConfigProperties){
this.r2dbcConfigProperties=r2dbcConfigProperties;
}
@凌驾
@豆子
公共连接工厂连接工厂(){
RoutingConnectionFactory connectionFactory=新RoutingConnectionFactory();
映射工厂=新的HashMap();
H2ConnectionConfiguration.Builder configurationBuilder=H2ConnectionConfiguration.Builder()
.property(H2ConnectionOption.MODE,“MySQL”)
.property(H2ConnectionOption.DB\u CLOSE\u DELAY,“-1”)
.property(H2ConnectionOption.DB在退出时关闭,假);
for(字符串租户:r2dbcConfigProperties.getTenants()){
字符串databaseName=r2dbcConfigProperties.getDbPrefix()+租户;
put(租户,新H2ConnectionFactory(configurationBuilder.inMemory(databaseName.build());
}
connectionFactory.SetTargetConnectionFactorys(工厂);
setDefaultTargetConnectionFactory(factories.get(“默认”));
返回连接工厂;
}
}
文件上说

TINYINT
可能的值为:-128到127。
另请参见整数文字语法映射到java.lang.Byte

因此,您应该将数据更改为如下类:

@Table("prep_task")
public class PrepTaskEntity implements Persistable<Long> {

    // .....

    @Column("is_active")
    private Byte isActive;

    // .....

    public boolean isActive() {
        return isActive != null && isActive != 0;
    }

    public void setActive(boolean active) {
        isActive = (byte) (active ? 1 : 0);
    }

    // .....

}
@表格(“准备任务”)
公共类PrepTaskEntity实现持久化{
// .....
@列(“是否处于活动状态”)
私有字节是活动的;
// .....
公共布尔isActive(){
返回isActive!=null&&isActive!=0;
}
public void setActive(布尔激活){
isActive=(字节)(active?1:0);
}
// .....
}
文件上说

TINYINT
可能的值为:-128到127。
另请参见整数文字语法映射到java.lang.Byte

因此,您应该将数据更改为如下类:

@Table("prep_task")
public class PrepTaskEntity implements Persistable<Long> {

    // .....

    @Column("is_active")
    private Byte isActive;

    // .....

    public boolean isActive() {
        return isActive != null && isActive != 0;
    }

    public void setActive(boolean active) {
        isActive = (byte) (active ? 1 : 0);
    }

    // .....

}
@表格(“准备任务”)
公共类PrepTaskEntity实现持久化{
// .....
@列(“是否处于活动状态”)
私有字节是活动的;
// .....
公共布尔isActive(){
返回isActive!=null&&isActive!=0;
}
public void setActive(布尔激活){
isActive=(字节)(active?1:0);
}
// .....
}

我认为问题可能在于您使用的是布尔值(原语)。尝试使用布尔值(包装器),我认为它可能会解决您的问题。@gagarwa也尝试使用布尔值。同样的情况。查看更新的StackTrace是否可以更新表以将isActive映射为BIT/BOOL/BOOLEAN?这就是我们的建议。问题是没有从Byte(映射到tinyint)到Boolean的转换器。我还将Integer映射到Boolean(在DB2中),但不确定这是一个类型问题(int vs byte)还是一个db问题,这对您不起作用。@gagarwa如果H2是这样,那么我应该为H2定义单独的sql脚本,为主应用程序定义单独的sql脚本。因为主数据库使用Mysql数据库,它没有布尔类型。这就是为什么使用TINYINT@gagarwa你是说这是推荐的吗?有没有提到这一点?这是R2DBC-H2的公开问题吗?因为在非反应性的世界里,这不是一个问题,我想问题可能在于你使用的是布尔值(原语)。尝试使用布尔值(包装器),我认为它可能会解决您的问题。@gagarwa也尝试使用布尔值。同样的情况。查看更新的StackTrace是否可以更新表以将isActive映射为BIT/BOOL/BOOLEAN?这就是我们的建议。问题是没有从Byte(映射到tinyint)到Boolean的转换器。我还将Integer映射到Boolean(在DB2中),但不确定这是一个类型问题(int vs byte)还是一个db问题,这对您不起作用。@gagarwa如果H2是这样,那么我应该为H2定义单独的sql脚本,为主应用程序定义单独的sql脚本。因为主数据库使用Mysql数据库,它没有布尔类型。这就是为什么使用TINYINT@gagarwa你是说这是推荐的吗?有没有提到这一点?这是o吗