【问题标题】:HttpRequestHandlingMessagingGateway JSON array payloadHttpRequestHandlingMessagingGateway JSON 数组有效负载
【发布时间】:2019-03-13 12:37:38
【问题描述】:

我无法使用 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 对象(而不是数组),jackson 会正确反序列化 SendgridTxEvent,因此问题仅出现在数组输入中。输入示例可以在here找到。

如何在 HTTP 入站适配器中使用 JSON 数组?

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

}

【问题讨论】:

  • 请同时发布其他文件。从 json 映射到目标文件?
  • @AlexLemesios 添加了SendgridTxEvent。是的,从 JSON 到对象集合
  • 你有 SendgridTxEvent 的包装吗?就像是一个集合的类?
  • @AlexLemesios 没有。我认为我将目标类型明确指定为ParameterizedTypeReference&lt;List&lt;SendgridTxEvent&gt;&gt;(){}。我想知道为什么适配器会忽略它。
  • 似乎org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport#extractRequestBody 不保留调用ResolvableType#resolve 的实际类型参数,因此HTTP 入站适配器不可能将JSON 数组转换为所需类型的集合。

标签: java json spring jackson spring-integration


【解决方案1】:

我已在框架中提出了解决此问题的问题:https://github.com/spring-projects/spring-integration/issues/2806

同时,作为一种解决方法,我建议将HttpRequestHandlingMessagingGateway 中的有效负载作为Stringbyte[],然后使用POJO @Transformer 下游通过ObjectMapper 直接转换,并且已经是您预期的&lt;List&lt;SendgridTxEvent&gt;输入。

另一个简单的选项,您可以期待 SendgridTxEvent[].class 并将其转换为下游列表。

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2021-12-10
    相关资源
    最近更新 更多