返回 json 或 xml 响应的 Spring 请求



我有一个Spring请求映射,我想默认返回XML,如果在请求标头中指定,则返回JSON。下面是一些代码:

请求映射

@RequestMapping(value = "/batch/{progName}", method = RequestMethod.GET, produces = "application/xml)
public ResponseEntity<JobResults> processTestObject(@PathVariable("progName") String progName,
@RequestHeader("Content-Type") String contentType) throws Exception {
HttpHeaders responseHeaders = MccControllerUtils.createCacheDisabledHeaders();
if(contentType.equals("application/json")) {
responseHeaders.setContentType(MediaType.APPLICATION_JSON);
}
LOGGER.info("Running batch program " + progName);
JobResults response = batchService.processProgName(progName);
return new ResponseEntity<JobResults>(response, responseHeaders, HttpStatus.OK);
}
  • 使用没有标头的邮递员,当我到达此端点时,我会收到一个400 Bad Request状态代码。
  • 在邮递员标题字段中,如果我Content-Type指定为application/xml我得到正确的 XML 响应。
  • 如果我将Content-Type指定为application/json则会收到错误 返回:Unexpected '<'

我想要什么:

默认情况下从终结点返回 XML,并返回 JSON(如果在请求中指定(

编辑

截至目前,当 Postman 中没有发送AcceptContent-Type时,请求返回400 Bad Request。为了检索所需的响应,我必须指定要application/xmlAcceptContent-Type

@RequestMapping(value = "/batch/{progName}", method = RequestMethod.GET)
public ResponseEntity<JobResults> processTestObject(@PathVariable("progName") String progName,
@RequestHeader("Content-Type") MediaType contentType) throws Exception {
HttpHeaders responseHeaders = MccControllerUtils.createCacheDisabledHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_XML);
if(!contentType.toString().equals("*/*")) {
responseHeaders.setContentType(contentType);
}
LOGGER.info("Running batch program " + progName);
JobResults response = batchService.processProgName(progName);
return new ResponseEntity<JobResults>(response, responseHeaders, HttpStatus.OK);
}

您的示例仍然从应该Accept的请求中获取Content-Type。其次,确保 JobResults 对象可由 json 封送器和 xml 封送器序列化。第三,如果您希望请求 json 的特定行为,您应该检查该特定媒体类型,而不是像"*/*"这样的通用媒体类型。

控制器:

@RequestMapping(value = "/batch/{progName}", method = RequestMethod.GET)
public ResponseEntity<JobResults> processTestObject(@PathVariable("progName") String progName,
@RequestHeader("Accept") MediaType accept) throws Exception {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_XML);
if(!accept.toString().equals("*/*")) {
responseHeaders.setContentType(accept);
}
JobResults response = new JobResults("23423", "result");
return new ResponseEntity<JobResults>(response, responseHeaders, HttpStatus.OK);
}

一些响应对象,但有注释。

@XmlRootElement
public class JobResults {
String id;
String name;
public JobResults(String id, String name) {
this.id = id;
this.name = name;
}
....
}

上面的代码在通过标头请求时为我提供了application/jsonAccept

最新更新