Код: Выделить всё
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
Подробности конфигурации
кв.@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