Spring boot 将请求 XML 转换为 JSON



我遇到的情况是,我们的一个应用程序很快就会退役。 但是,还有另一个应用程序是从它构建的(在 Spring 引导中(,它已经创建。问题是,上游系统向我们发送了一个 XML 请求,而新应用程序只使用 JSON。但是,上游系统现在没有足够的带宽来更改其代码以在退役的死线发生之前与我们的新 JSON 服务保持一致,因此我需要创建一个 XML JSON 包装器。


我的问题:

弹簧启动可以以什么方式处理这种情况?例如,在控制器类中验证以首先查看请求是否为 XML,如果将其转换为 JSON 请求,这将命中我的新服务。对于此方案,还有哪些其他选项?


@Validated
@RestController
@RequestMapping(path="/ccc")
public class CustomerCommGatewayInterface {
@Autowired
CCCatewayService gatewayService;
@RequestMapping(method=RequestMethod.POST, value="/comm-history")
public HistoryResponse getCustomerCommunicationHistory(@Valid 
@RequestBody HistoryRequest request) {
return gatewayService.getHistory(request);
}
}

波乔类

public class ServiceRequest {
@NotNull(message = "{error.application.id.invalid}")
@NotBlank(message = "{error.application.id.invalid}")
private String applicationId;
@NotNull(message = "{error.requestTypes.null}")
@RequestTypes(acceptedValues={"Stuff", "More stuff"})
private List<String> requestTypes;
@Pattern(regexp = "(Retrieve)|(Contacts)|(Documents)$", message = "{error.subService.invalid}")
private String subService;
@Pattern(regexp = "(\d{1,10})", message = "{error.customer.id.invalid}")
private String customerId;
@Pattern(regexp = "(\d{5})", message = "{error.account.number.invalid}")
private String accountNumber;
@Pattern(regexp = "(\d{10})", message = "{error.mtn.invalid}")
private String number;
@EmailId()
private String emailAddress;
private String category;
private String categoryKeyword;
private String preOrderNumber;
private String requestCategory;
private String channelType;
private String ecpdId;
private String subscriberId;
private String returnCountLimit;
@Pattern(regexp = "((0?[1-9]|1[012])/(0?[1-9]|[12][0-9]|3[01])/(19|20)\d\d)|(^()$)", message = "{error.date.invalid}")
private String startDate;
@Pattern(regexp = "((0?[1-9]|1[012])/(0?[1-9]|[12][0-9]|3[01])/(19|20)\d\d)|(^()$)", message = "{error.date.invalid}")
private String endDate;
private String includeDismissedCards;
...
//getters and setters
}

不需要新的终结点定义。单个终结点可以根据请求标头读取多个请求正文类型Content-Type并根据Accept请求标头写入不同的响应正文类型。

Spring 将使用注册的转换器 bean 转换请求正文,例如MappingJackson2HttpMessageConverter.转换器 Bean 是根据请求标头选择Content-Type。如果您将端点限制为仅支持 JSON,例如通过使用@RequestMapping(consumes = "application/json")注释@Controller,则转换不会是动态的。

如果配置其他支持 XML 的转换器,例如org.springframework.http.converter.xml.MarshallingHttpMessageConverter请求正文将作为 XML 进行处理,前提是MarshallerBean 配置为将 XML 映射到正确的 POJO 类型。根据类javadoc:

默认情况下,此转换器支持文本/xml和应用程序/xml。这可以通过设置支持的媒体类型属性来重写。

最新更新