Я не могу получить входящий HTTP-адаптер для преобразования массива JSON в список объектов типа SendgridTxEvent
, он всегда заканчивается ArrayList<LinkedHashMap>
вместо List<SendgridTxEvent>
. Конфиг:
public HttpRequestHandlingMessagingGateway sendgridMessageAdapter(@Qualifier("sendgridWebhookEvents") MessageChannel channel) {
HttpRequestHandlingMessagingGateway httpInboundChannelAdapter = new HttpRequestHandlingMessagingGateway(false);
RequestMapping mapping = new RequestMapping();
mapping.setMethods(HttpMethod.POST);
mapping.setPathPatterns("/webhook/sendgrid");
ParameterizedTypeReference<List<SendgridTxEvent>> ptr = new ParameterizedTypeReference<List<SendgridTxEvent>>() {
};
httpInboundChannelAdapter.setRequestMapping(mapping);
httpInboundChannelAdapter.setRequestChannel(channel);
httpInboundChannelAdapter.setRequestPayloadType(ResolvableType.forType(ptr));
return httpInboundChannelAdapter;
}
Если я установлю тип полезной нагрузки запроса на httpInboundChannelAdapter.setRequestPayloadType(ResolvableType.forType(SendgridTxEvent.class))
и передам ему объект JSON (вместо массива), Джексон корректно десериализует SendgridTxEvent
, поэтому проблема возникает только при вводе массива. Примеры ввода можно найти здесь .
Как мне использовать массивы JSON во входящем адаптере HTTP?
SendgridTxEvent
класс:
@JsonIgnoreProperties(ignoreUnknown = true)
public class SendgridTxEvent {
public enum Event {
PROCESSED,
DROPPED,
DELIVERED,
BOUNCE,
DEFERRED,
OPEN,
CLICK,
UNSUBSCRIBE,
SPAMREPORT;
@JsonCreator
public static Event forValue(String value) {
return Event.valueOf(value.toUpperCase());
}
}
private String email;
private Long timestamp;
private Event event;
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private List<String> category;
private String sgEventId;
private String sgMessageId;
//getters, setters
}