我有一种情况,我们的其中一个应用程序即将退役。但是,已经从中创建了另一个应用程序(在春季启动中)。问题在于,上游系统向我们发送了XML请求,而新应用程序仅使用JSON。但是,上游系统现在没有带宽,可以在退役的最后期限发生之前更改其代码以适应我们的新JSON服务,因此我需要创建一个XML JSON包装器。
我的问题:
Spring Boot如何处理这种情况?例如,在Controller类中,首先验证该请求是否为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);
}
}
POJO类
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
}
答案 0 :(得分:0)
您不需要新的端点定义。单个端点可以基于Content-Type
请求标头读取多种请求正文类型,并可以基于Accept
请求标头写入不同的响应正文类型。
Spring将使用已注册的转换器Bean(例如, MappingJackson2HttpMessageConverter
。根据{{1}}请求标头选择了转换bean。如果您将端点限制为仅支持JSON,则转换将不会是动态的。通过用Content-Type
注释@Controller
。
如果您配置了其他支持XML的转换器,例如org.springframework.http.converter.xml.MarshallingHttpMessageConverter
,如果@RequestMapping(consumes = "application/json")
bean被配置为将XML映射到正确的POJO类型,则请求主体将作为XML处理。按照类javadoc:
默认情况下,此转换器支持text / xml和application / xml。可以通过设置supportedMediaTypes属性来覆盖它。