【发布时间】:2021-07-13 15:16:29
【问题描述】:
我正在尝试使用自定义反序列化器:
@JsonComponent
class SuffixDeserializer extends JsonDeserializer<String> {
private final String suffix;
SuffixDeserializer(@Value("${suffix}") String suffix) {
this.suffix = suffix;
}
@Override
public String deserialize(JsonParser json, DeserializationContext ctx)
throws IOException {
return json.getText() + suffix;
}
}
对于 RabbitMQ 侦听器:
@Slf4j
@Service
class FooListener {
@RabbitListener(queuesToDeclare = @Queue(name = "foo", durable = "true"))
void foo(Message msg) {
log.info("Received {}", msg);
}
@Data
static class Message {
@JsonDeserialize(using = SuffixDeserializer.class)
private String field;
}
}
我什至尝试显式注册JsonComponentModule:
@Bean
public MessageConverter jsonConverter() {
ObjectMapper mapper = new ObjectMapper()
.registerModule(new JsonComponentModule());
return new Jackson2JsonMessageConverter(mapper);
}
但是当我运行这段代码时,我得到了以下错误:
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Class io.github.jjarzynski.jsoncomponentmq.SuffixDeserializer has no default (no arg) constructor
at [Source: (String)"{"field": "bar"}"; line: 1, column: 1]
这意味着 Jackson 正在尝试创建自己的实例而不是使用 Spring Bean。
如何将自定义 Spring Bean 反序列化器应用于传入 RabbitMQ 消息中的字段?
【问题讨论】:
标签: spring rabbitmq spring-amqp spring-rabbit jackson-databind