Java 21 Sqs Sulderer не может анализировать пользовательский объект, отправленный как сообщениеJAVA

Программисты JAVA общаются здесь
Anonymous
Java 21 Sqs Sulderer не может анализировать пользовательский объект, отправленный как сообщение

Сообщение Anonymous »

Я обновляю систему на основе микросервисов от Java 17 до Java 21, работая на Spring Boot 3 и Spring Framework 6. Мое приложение отправляет пользовательский объект (событие) в очередь AWS SQS, но мое слушатель сообщений ожидает строки. Это хорошо сработало в Java 17, но после обновления мой слушатель не может обработать сообщение из -за проблемы с подбором JSON.

Код: Выделить всё

Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'no': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 3]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2572)
at com.fasterxml.jackson.core.JsonParser._constructReadException(JsonParser.java:2598)
at com.fasterxml.jackson.core.JsonParser._constructReadException(JsonParser.java:2606)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:765)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:3018)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:2996)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._matchToken(ReaderBasedJsonParser.java:2761)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._matchNull(ReaderBasedJsonParser.java:2747)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:750)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:4992)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4898)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3848)
at org.springframework.messaging.converter.MappingJackson2MessageConverter.convertFromInternal(MappingJackson2MessageConverter.java:251)
... 27 common frames omitted
< /code>
После отладки я обнаружил, что payload.tostring () внутри картирования Jackson2messageConverter возвращает что -то вроде: < /p>
no.com.common.Event@6f8e5dfd
Вместо представления строки JSON.
Подробности конфигурации
кв.@SqsListener(value = "${sqs.queue.event.in}", acknowledgementMode = SqsListenerAcknowledgementMode.MANUAL)
public void receiveHourEvent(Acknowledgement acknowledgement, String event){
LOG.info("SQSListener triggered");
}
< /code>
@Bean
SqsMessageListenerContainerFactory defaultSqsListenerContainerFactory(SqsAsyncClient sqsAsyncClient,
SqsMessagingMessageConverter sqsMessagingMessageConverter,
SqsReceiverErrorHandler sqsReceiverErrorHandler,
@Value("${sqs.poll.timeout}") Duration pollTimeout,
@Value("${sqs.poll.messagevisibility}") Duration pollMessageVisibility) {
return SqsMessageListenerContainerFactory
.builder()
.configure(options -> options
.maxMessagesPerPoll(10)
.pollTimeout(pollTimeout)
.messageVisibility(pollMessageVisibility)
.messageConverter(sqsMessagingMessageConverter))
.sqsAsyncClient(sqsAsyncClient)
.messageInterceptor(new BreadcrumbMessageInterceptor())
.errorHandler(sqsReceiverErrorHandler)
.build();
}

@Bean
SqsTemplate sqsTemplate(SqsAsyncClient sqsAsyncClient, SqsMessagingMessageConverter sqsMessagingMessageConverter) {
SqsTemplate sqsTemplate = SqsTemplate.builder()
.sqsAsyncClient(sqsAsyncClient)
.messageConverter(sqsMessagingMessageConverter)
.build();
return sqsTemplate;
}

@Bean
public SqsMessagingMessageConverter sqsMessagingMessageConverter(SqsExtendedClient sqsExtendedClient) {
ExtendedSqsMessagingMessageConverter converter = new ExtendedSqsMessagingMessageConverter(sqsExtendedClient);
converter.setObjectMapper(JsonMappers.getObjectMapper());
return converter;
}

< /code>
private static ObjectMapper initializeMapper() {
final ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
.setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.registerModule(new JavaTimeModule());
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
mapper.disable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS);
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

return mapper;
}

public static T fromJson(String text, Class type) {
try {
return getObjectMapper().readValue(text, type);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

public static String toJson(T value) {
try {
return getObjectMapper().writeValueAsString(value);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

< /code>
Event Object:

public class Event {
String eventName;
Instant dateTime;
}
< /code>
I use sqsTemplate to send it and in my code it looks like this:
sqsTemplate.send(queueName, myEvent);
< /code>
I have verified that toJson(myEvent) properly serializes the object when called manually. I have ensured that sqsMessagingMessageConverter is set correctly in SqsTemplate. After debugging I see that payload.toString() inside MappingJackson2MessageConverter returns an object reference instead of a JSON string.
return this.objectMapper.readValue(payload.toString(), javaType)
< /code>
I am using following dependencies:


com.fasterxml.jackson.datatype
jackson-datatype-jsr310
2.17.2


com.fasterxml.jackson.core
jackson-databind
2.17.2

< /code>
Why is the payload being treated as an object reference instead of a JSON string? Is there something missing in my ObjectMapper configuration, or do I need to adjust how SqsMessagingMessageConverter is handling serialization?

Подробнее здесь: https://stackoverflow.com/questions/795 ... as-message

Вернуться в «JAVA»