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

Spring Boot中Jackson序列化MyObjectMessage遇类型转换异常求助

解决思路

1. 用Jackson Mixin忽略有问题的Getter方法

因为无法修改第三方类代码,Mixin是Jackson提供的无侵入式方案,可给现有类添加Jackson注解。你可以创建一个Mixin接口,标记要忽略的getPayloadByteArrayOverflow()方法:

import com.fasterxml.jackson.annotation.JsonIgnore;

public interface MyObjectMessageMixin {
    @JsonIgnore
    byte[] getPayloadByteArrayOverflow();
}

再将这个Mixin注册到ObjectMapper实例中:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(MyObjectMessage.class, MyObjectMessageMixin.class);

这样Jackson序列化时会跳过这个方法,避免触发类型转换异常。

2. 自定义序列化器手动控制序列化逻辑

如果需要更精细的属性控制(比如只序列化指定属性),可以编写自定义JsonSerializer,手动提取需要的属性,完全绕过有问题的方法:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

public class MyObjectMessageSerializer extends JsonSerializer<MyObjectMessage> {
    @Override
    public void serialize(MyObjectMessage value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        // 手动写入你需要的属性,示例:
        gen.writeStringField("messageId", value.getMessageId());
        gen.writeObjectField("payload", value.getPayload());
        // 跳过getPayloadByteArrayOverflow相关属性
        gen.writeEndObject();
    }
}

然后将序列化器注册到ObjectMapper:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new SimpleModule()
        .addSerializer(MyObjectMessage.class, new MyObjectMessageSerializer()));

3. 转换为自定义DTO后再序列化

如果第三方类的属性不多,可创建一个对应属性的DTO类,将第三方对象的属性复制到DTO中,再序列化DTO:

public class MyObjectMessageDTO {
    private String messageId;
    private Object payload;
    // 其他需要的属性及对应的getter/setter

    // 构造方法,从MyObjectMessage复制属性
    public MyObjectMessageDTO(MyObjectMessage source) {
        this.messageId = source.getMessageId();
        this.payload = source.getPayload();
        // 复制其他需要的属性,跳过getPayloadByteArrayOverflow相关内容
    }
}

之后序列化这个DTO:

MyObjectMessageDTO dto = new MyObjectMessageDTO(originalMessage);
String json = objectMapper.writeValueAsString(dto);
jmsTemplate.convertAndSend(json);

4. 调整Jackson的属性自动检测规则

Jackson默认会自动检测所有getter方法,你可以修改检测规则,只序列化字段而忽略getter方法(需确保第三方类字段可访问,或配合Mixin设置字段可见性):

ObjectMapper objectMapper = new ObjectMapper();
// 关闭getter的自动检测
objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
// 开启字段的自动检测
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

注意:如果第三方类字段是private的,Jackson默认无法访问,可配合Mixin设置字段可见性,或启用objectMapper.enable(MapperFeature.AUTO_DETECT_FIELDS);。


内容的提问来源于stack exchange,提问作者Holland Park

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:23:26