警告: Error while extracting database product name - falling back to empty error codes

本文解决了一个 Spring 应用程序在尝试通过 JDBC 连接到 Oracle 数据库时出现的问题,具体错误为 ORA-12505,表示监听器当前不知道连接描述符中给出的 SID。该问题可能是由于数据库配置不正确导致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2011-12-16 10:14:24 org.springframework.jdbc.support.SQLErrorCodesFactory getErrorCodes
警告: Error while extracting database product name - falling back to empty error codes
org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
The Connection descriptor used by the client was:
localhost:1521:orcl

)


数据库没有写对 不存在所连接的数据库listener does not currently know of SID given in connect descriptor


<think>嗯,用户遇到了在处理布尔类型响应时的未知异常问题,错误信息显示从application/json返回类型中提取布尔值时报错。根据用户引用的四个文档片段,可以从中提取一些关键线索进行分析。首先注意到用户提供的错误信息中存在类型冲突:应用宣称返回XML但实际上返回的是JSON数据(引用[1])。另一个关键点是在引用[2]中出现的异常日志,Jackson解析器在试图解析JSON时遇到了类似XML的特殊字符'<',导致后续的'5'字符解析失败。这种首尾字符的错位很像XML声明混入JSON响应的情况。在技术层面,引用[3]展示了自定义JSON错误序列化器的实现方式,而引用[4]则暴露了关键配置点——Feign客户端的Decoder配置和自定义ObjectMapper的设置。特别是ObjectMapper配置开启了很多宽松解析模式,但唯独没有配置处理"无内容响应"的策略。这提示了三种可能故障场景:①服务端返回了类似"<boolean>true</boolean>"这样的伪XML格式;②响应体为空但声明为布尔类型;③特殊字符导致Jackson的自动检测机制失效。考虑到布尔类型本身的简单性,解决方案应当优先检查底层通信配置。FeignDecoder里配置的ObjectMapper需要特别关注两点:是否支持从空字符串转化布尔值(enable(ACCEPT_EMPTY_STRING_AS_NULL_OBJECT)),以及是否需要强制指定内容类型为application/json的解析器。用户可能真正困惑的是:明明处理的是简单布尔值,为何会抛出复杂的解析异常?这暗示问题可能出在传输层而非业务逻辑层。基于Spring生态的特点,推荐方案分三层推进:先用Feign拦截器确保接收的是原始JSON字符串,再强化ObjectMapper的容错配置,最后在布尔解析场景单独处理空响应情况。这样既能覆盖当前异常,也能预防其他数据类型可能出现的类似问题。</think> 基于提供的引用来解决布尔类型响应异常问题,以下是系统化的解决方案和关键优化点: --- ### **问题分析** 根据引用信息,异常核心是**响应类型标识与实际内容不匹配**: 1. 服务端声明返回 `application/xml` 但实际返回 `application/json`(引用[^1]) 2. 解析器尝试按XML解析JSON数据,导致 `Unexpected character` 错误(引用[^2]) 3. 在Feign客户端解析布尔值时,可能遭遇空响应或非法格式(如 `5` 出现在XML结构符后) --- ### **解决方案** #### 1. **强制统一响应类型** 在Feign客户端配置中锁定内容类型解析规则: ```java // 引用[^4]修改 feignDecoder 配置 public Decoder feignDecoder() { ObjectMapper objectMapper = customObjectMapper(); // 强制要求所有响应按JSON处理 HttpMessageConverter<?> converter = new MappingJackson2HttpMessageConverter(objectMapper) { @Override public boolean canRead(Class<?> clazz, @Nullable MediaType mediaType) { return true; // 无论Content-Type声明均按JSON解析 } }; ObjectFactory<HttpMessageConverters> factory = () -> new HttpMessageConverters(converter); return new ResponseEntityDecoder(new SpringDecoder(factory)); } ``` #### 2. **增强ObjectMapper容错能力** 针对布尔值解析优化配置(引用[^4]补充): ```java public ObjectMapper customObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 允许空字符串作为null处理 objectMapper.enable(JsonParser.Feature.ALLOW_MISSING_VALUES); // 关键:配置布尔值特殊处理逻辑 objectMapper.registerModule(new SimpleModule() .addDeserializer(Boolean.class, new JsonDeserializer<Boolean>() { @Override public Boolean deserialize(JsonParser p, DeserializationContext ctx) { // 处理空值返回false if (p.getCurrentToken() == JsonToken.VALUE_NULL) return false; // 处理字符串"true"/"1"等特殊情况 String text = p.getText().trim(); return "true".equalsIgnoreCase(text) || "1".equals(text); } })); return objectMapper; } ``` #### 3. **服务端修正Content-Type** 在响应头中强制声明正确类型(补救措施): ```java @RestController public class ApiController { @GetMapping("/bool-endpoint") public ResponseEntity<Boolean> getBool() { return ResponseEntity.ok() .contentType(MediaType.APPLICATION_JSON) // 显式设置类型 .body(true); } } ``` --- ### **根本原因定位** 1. **服务端/网关错误**:部分中间件可能篡改响应头(引用[^1]) 2. **数据污染**:响应体中混入非JSON字符(如日志输出)导致解析中断(引用[^2]) 3. **空响应处理缺失**:对HTTP 204等无内容响应未做兼容 --- ### **验证流程** ```mermaid graph TD A[发起布尔请求] --> B{响应头检查} B -->|Content-Type=JSON| C[正常解析] B -->|Content-Type≠JSON| D[强制JSON解析] D --> E{响应体内容} E -->|空值| F[返回false] E -->|非布尔文本| G[智能转换] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值