org.hibernate.TypeMismatchException: Provided id of the wrong type for class

在使用Atomikos写demo的时候,用spring整合hibernate写一个查询,报错:org.hibernate.TypeMismatchException: Provided id of the wrong type for class aniyo.jta.atomikos.domain.BankAccount. Expected: class java.lang.Integer, got class java.lang.String

方法如下:

@Override
	public BankAccount getByUsername(String username) {
		return (BankAccount) this.getSession().get(BankAccount.class, username);
	}

 

因为没怎么用过hibernate,很多东西也不熟悉,到网上查了一下相关资料,后面才发现,this.getSession().get()方法,是通过id来查询的,所以这里会报错说,提供id类型错误,我这里传的是一个String的username,所以这里要通过username查询,可能过createQuery来查;最后修改如下:

@Override
	@SuppressWarnings("unchecked")
	public BankAccount getByUserName(String username) {
		 List<BankAccount> list = this.getSession().createQuery(
	                "select t from BankAccount t where t.username=:userName")
	                .setParameter("userName", username).list();
	        return list.isEmpty() ? null : list.get(0);
	}

 

<think>嗯,用户遇到了Spring Bean创建失败的问题,具体是类型不匹配导致的异常,涉及端口字段从字符串转整数的NumberFormatException。我需要一步步分析可能的原因和解决方法。首先,用户提到TypeMismatchException和NumberFormatException,这两个异常通常发生在属性注入时类型不一致的情况下。比如,配置文件中端口可能写成字符串形式,而Bean中的字段是int类型,导致转换失败。 接下来,我应该考虑配置文件的来源,可能是application.properties或application.yml。用户可能在配置文件中将端口写成非数值类型,比如port="8080",而引号会导致值被视为字符串,注入到int字段时会出错。需要检查配置文件中的端口设置是否正确,是否使用了正确的语法。例如,在.properties文件中应该是server.port=8080,而不是server.port="8080"。 然后,考虑Bean中的字段类型是否正确。用户可能将端口字段声明为String,而实际上应该用int,或者相反。比如,如果Bean中的字段是int port,但配置的值是字符串,就会抛出NumberFormatException。需要核对Bean类的字段类型和配置文件中的值类型是否一致。 另外,使用@Value注解注入属性时,如果字段是基本类型如int,而配置值为空或无效,也会导致异常。这时候可以设置默认值,比如@Value("${server.port:-1}"),这样当配置缺失时,会使用-1作为默认值,避免NumberFormatException。 还有可能是环境变量或系统属性的覆盖问题,比如通过命令行参数设置了端口,但格式不正确。需要检查所有可能的外部配置来源,确保端口值正确无误。 最后,建议用户检查配置文件、Bean字段类型、@Value注解的使用,以及是否存在多个配置源的冲突。同时,使用IDE的配置元数据检查功能,或者开启调试日志,帮助定位问题来源。</think>### Spring Bean创建失败的类型不匹配问题解决步骤 #### 1. 检查配置文件中的端口值 在`application.properties`或`application.yml`中,确认端口值的语法: ```properties # 正确示例(数值类型) server.port=8080 # 错误示例(字符串形式会引发转换异常) server.port="8080" ``` 在YAML中需注意缩进和数据类型: ```yaml server: port: 8080 # 正确 port: "8080" # 错误 ``` #### 2. 验证Bean字段类型 确保Bean类中接收端口值的字段类型与配置一致: ```java // 正确示例 @Value("${server.port}") private int port; // 基本类型或Integer包装类型 // 错误示例(类型不匹配) @Value("${server.port}") private String port; // 引发TypeMismatchException ``` #### 3. 添加默认值防止空值异常 使用`@Value`注解的默认值机制: ```java @Value("${server.port:-1}") // 当配置缺失时默认返回-1 private int port; ``` 此方法可避免`NumberFormatException: Failed to convert value of type 'java.lang.String' to int`[^1] #### 4. 检查环境变量覆盖 通过命令行参数或系统环境变量检查可能的值覆盖: ```bash # 启动命令中的错误示例 java -jar app.jar --server.port="tcp8080" # 字符串导致转换失败 # 正确形式 java -jar app.jar --server.port=8080 ``` #### 5. 调试配置加载过程 在`application.properties`中添加调试配置: ```properties logging.level.org.springframework.boot.env=DEBUG ``` 观察控制台输出,定位具体加载的配置值。 #### 6. 验证自定义属性源 若使用`@PropertySource`加载自定义配置: ```java @Configuration @PropertySource("classpath:custom.properties") public class AppConfig { @Value("${tcp.port}") private int tcpPort; // 需确保custom.properties中tcp.port是数值 } ``` #### 7. 处理FactoryBean的特殊情况 如果通过`FactoryBean`创建Bean,需在`getObject()`方法中显式处理类型转换: ```java public class TcpPortFactory implements FactoryBean<Integer> { @Override public Integer getObject() throws Exception { String portValue = env.getProperty("tcp.port"); return Integer.parseInt(portValue); // 显式转换 } } ``` 该方法遵循Spring对FactoryBean的处理流程[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值