Spring Boot将请求XML转换为JSON

时间:2018-08-09 19:37:46

标签: java spring-boot

我有一种情况,我们的其中一个应用程序即将退役。但是,已经从中创建了另一个应用程序(在春季启动中)。问题在于,上游系统向我们发送了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
}

1 个答案:

答案 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属性来覆盖它。