You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:23:14