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
相关产品推荐
相关产品推荐

