Полезная нагрузка массива JSON HttpRequestHandlingMessagingGateway - PullRequest
1 голос
/ 13 марта 2019

Я не могу получить входящий 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

}

1 Ответ

1 голос
/ 14 марта 2019

Я поднял проблему, чтобы исправить это в Framework: https://github.com/spring-projects/spring-integration/issues/2806

Между тем в качестве обходного пути я бы предложил рассчитать полезную нагрузку в HttpRequestHandlingMessagingGateway как String или byte[], а затем использовать POJO @Transformer в нисходящем направлении с прямым преобразованием через ObjectMapper и уже ожидаемым <List<SendgridTxEvent> типа.

Еще один простой вариант, который можно ожидать только SendgridTxEvent[].class и затем преобразовать его в список вниз по течению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...