【问题标题】:Return XML or JSON from a REST controller based on request parameters根据请求参数从 REST 控制器返回 XML 或 JSON
【发布时间】:2021-05-17 08:54:15
【问题描述】:

这是我的控制器:

@PostMapping(value = "/endpoint", produces = { APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE})
@ResponseBody
public Result generateResult(@Valid @RequestBody Request request) throws JsonProcessingException {

    Result result = new Result();
    // some code here
    return result;
}

这是我的请求类:

@Data
@NoArgsConstructor
public class Request {

    @NotNull
    private String name;
    
    private String type = "application/json";
}

控制器根据客户端发送的请求中的Accept 标头生成正确的输出。但是,我不想发送 Accept 标头,只发送以下请求:

{
    "name": "my name",
    "type": "application/xml"
}

然后根据type 输出正确的格式。我尝试将HttpServletResponse response添加到控制器方法的参数列表中,然后像这样设置内容类型:

response.setHeader(CONTENT_TYPE, request.geType());

但它总是返回 json。知道我还应该做什么吗?

【问题讨论】:

标签: java json xml spring-boot


【解决方案1】:

我认为标准 Spring 的 ResponseEntity 构建器可以为您提供所有需要的多样性:

        return ResponseEntity
                .ok(//any object for json structure)
                .headers(//any header)
                .build();

您可以使用任何其他方法(即 http 状态码)代替 .ok()

    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("MyHeader", "MyValue");
    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.OK);

【讨论】:

  • 当我使用这种方法设置标题时出现错误:标题具有私有访问权限。
  • 创建新的 Header 例如 HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.set("Any-Header", "Any-Value") 并将 responseHeaders 设置为 .headers(responseHeaders )。这是标准的 Spring api
  • 如果您不能使用 ResponseEntityBuilder,我会从 spring 文档中添加其他信息。
【解决方案2】:

基于 cmets,我发布了这个对我有用的答案。我改变了我的控制器方法是这样的:

@PostMapping(value = "/endpoint", produces = { APPLICATION_JSON_VALUE, 
APPLICATION_XML_VALUE})
@ResponseBody
public ResponseEntity<Result> generateResult(@Valid @RequestBody Request request) 
    throws JsonProcessingException {

Result result = new Result();
// some code here
return ResponseEntity.accepted()
            .headers(headers)
            .body(result);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多