JUnit测试抛出Jackson InvalidDefinitionException错误求助
问题解决:Jackson序列化java.lang.Object报错InvalidDefinitionException
错误场景
运行JUnit测试时触发com.fasterxml.jackson.databind.exc.InvalidDefinitionException,提示找不到java.lang.Object的序列化器,无属性可创建BeanSerializer。
涉及代码
业务方法代码
public String processResponseAudit(Object inquireClaimFilterResponse, String userId, String spanId, String corelationId) throws UnknownHostException, JsonProcessingException { String auditStatus = ""; ObjectMapper objectMapper = new ObjectMapper(); String responseJson = objectMapper.writeValueAsString(inquireClaimFilterResponse); LocalDateTime myDateObj = LocalDateTime.now(); DateTimeFormatter dateStampObj = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"); String dateStamp = myDateObj.format(dateStampObj); LocalDateTime localDateTime = LocalDateTime.parse(dateStamp, dateStampObj); MapSqlParameterSource auditParams = new MapSqlParameterSource(); auditParams.addValue(RSPNS_TIMESTAMP, Timestamp.valueOf(myDateObj)); auditParams.addValue(RSPNS_BODY, responseJson, java.sql.Types.OTHER); auditParams.addValue(MODIFIED_BY, userId); auditParams.addValue(MODIFIED_DATE, localDateTime, java.sql.Types.TIMESTAMP); auditParams.addValue(CORLTN_ID, corelationId); auditParams.addValue(SPAN_ID, spanId); int auditResponse = selfServiceDao.auditApiResponseData(auditParams); if (auditResponse == 1) { auditStatus = "Audit Data Inserted Successfully"; } else if (auditResponse == 0) { auditStatus = "Audit Data Insertion Failed"; } return auditStatus; }
JUnit测试代码
@Test public void testProcessResponseAudit_Success() throws JsonProcessingException, UnknownHostException { when(selfServiceDao.auditApiResponseData(any(MapSqlParameterSource.class))).thenReturn(1); Object inquireClaimFilterRequest = new Object(); String result = selfServiceCoreClaimImpl.processResponseAudit(inquireClaimFilterRequest, "testUser", UUID.randomUUID().toString(), UUID.randomUUID().toString()); assertEquals("Audit Data Inserted Successfully", result); }
错误堆栈
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.lang.Object and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1308) at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:414) at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:53) at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:30) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:479) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:318) at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4719) at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3964) at com.impl.SelfServiceCoreClaimImpl.processResponseAudit(SelfServiceCoreClaimImpl.java:257) at com.impl.SelfServiceCoreClaimImplTest.testProcessResponseAudit_Success(SelfServiceCoreClaimImplTest.java:132) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
解决办法
方案1:修改测试代码,传入真实业务对象
实际业务场景中,inquireClaimFilterResponse应该是带有属性的业务类实例,而非空的java.lang.Object。测试时改用对应业务类的实例(或模拟实例):
@Test public void testProcessResponseAudit_Success() throws JsonProcessingException, UnknownHostException { when(selfServiceDao.auditApiResponseData(any(MapSqlParameterSource.class))).thenReturn(1); // 替换为实际业务类,比如InquireClaimFilterResponse InquireClaimFilterResponse inquireClaimFilterRequest = new InquireClaimFilterResponse(); // 按需设置属性 inquireClaimFilterRequest.setSomeProperty("testValue"); String result = selfServiceCoreClaimImpl.processResponseAudit(inquireClaimFilterRequest, "testUser", UUID.randomUUID().toString(), UUID.randomUUID().toString()); assertEquals("Audit Data Inserted Successfully", result); }
方案2:配置ObjectMapper禁用空对象序列化失败特性
在创建ObjectMapper时添加配置,允许序列化无属性的对象:
public String processResponseAudit(Object inquireClaimFilterResponse, String userId, String spanId, String corelationId) throws UnknownHostException, JsonProcessingException { String auditStatus = ""; ObjectMapper objectMapper = new ObjectMapper(); // 添加此行配置 objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); String responseJson = objectMapper.writeValueAsString(inquireClaimFilterResponse); // 后续代码不变 }
方案3:优化方法参数类型,提高类型安全性
将方法参数从Object改为具体业务类,从根源避免传入无法序列化的对象:
// 将参数类型从Object改为实际业务类InquireClaimFilterResponse public String processResponseAudit(InquireClaimFilterResponse inquireClaimFilterResponse, String userId, String spanId, String corelationId) throws UnknownHostException, JsonProcessingException { // 后续代码不变 }
内容的提问来源于stack exchange,提问作者dhS
相关产品推荐
相关产品推荐

