【发布时间】: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<List<SendgridTxEvent>>(){}。我想知道为什么适配器会忽略它。 -
似乎
org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport#extractRequestBody不保留调用ResolvableType#resolve的实际类型参数,因此HTTP 入站适配器不可能将JSON 数组转换为所需类型的集合。
标签: java json spring jackson spring-integration