从Spring控制器方法发送Json响应的最佳实践

时间:2017-06-20 09:26:06

标签: java json spring-mvc

我想从spring控制器返回一个字符串(json字符串)作为对它收到的AJAX调用的响应,响应可能因我是否提交了@Valid表单而有所不同。这就是我处理它的方式,并想知道这是否被视为最佳实践? 请注意我正在使用@RestController,所以@ResonseBody应用所有方法。

    @RequestMapping(value = "/save" , method = RequestMethod.POST)
public String saveScheduledAlert(@Valid ScheduledAlertForm scheduledAlertForm, BindingResult bindingResult) {
    StringBuilder jsonString = new StringBuilder();
    if(bindingResult.hasErrors()){
        jsonString.append("{\"success\" : \"false\"");
        for(ObjectError error : bindingResult.getAllErrors())
            jsonString.append(",\"").append(((FieldError) error).getField()).append("\":\"").append(error.getDefaultMessage()).append("\"");
    } else {
        //save the data
        jsonString.append("{\"success\" : \"true\"");
    }

    jsonString.append("}");
    return jsonString.toString();


}

3 个答案:

答案 0 :(得分:2)

基本上你要做的就是生成2个pojos

public class RestWrapperDTO {
    protected boolean success;
    public boolean isSuccess() {
        return success;
    }
    public void setSuccess(boolean value) {
        success = value
    }
}

和另一个错误DTO

public class RestErrorDTO extends RestWrapperDTO {
    private Map<String, String> errors;

    public Map<String, String> getErrors() {
        return errors;
    }
    public void setErrors(Map<String, String> value) {
        errors = value
    }
}

和您的控制器

@RequestMapping(value = "/save" , method = RequestMethod.POST)
public RestWrapperDTO saveScheduledAlert(@Valid ScheduledAlertForm scheduledAlertForm, BindingResult bindingResult) {
    StringBuilder jsonString = new StringBuilder();

    if(bindingResult.hasErrors()){
        RestErrorDTO errorDTO = new RestErrorDTO();
        // fill map with errors here
        return errorDTO;
    } else {
        RestWrapperDTO wrapperDTO = new RestWrapperDTO();
        wrapperDTO.setSuccess(true);
        return wrapperDTO;
    }
}

它不是最充足的代码,但它可以帮助你:D

  

如果你使用简单的@Controller注释 - 你是什么   寻找的是@ResponseBody - 注释

     

或者如果您使用@RestController,那么

     

您只需返回具有Seri​​alizable - a接口的对象即可   简单的POJO和弹簧将处理其余部分。

     

进一步阅读:

     

答案 1 :(得分:2)

一个老问题,但是对于其他需要帮助的人,我为此使用了一个自定义ApiResponse类。我的课看起来像这样:

public class ApiResponse<T> {
    String message;
    int statusCode;
    T data

    //....getters and setters

这样,我可以使用“ SUCCESS”或“ ERROR”作为消息,使用适当的HttpStatus代码,然后使用任何类型作为要发送的数据。

然后,在控制器中,我只是这样做:

@PostMapping("/sign-up")
public ResponseEntity<String> signUp(@RequestBody Account account) {
  
  if (accountService.getAccountByEmail(account.getEmail()) != null) {
      ApiResponse<String> apiResponse = new ApiResponse<>("A user with that email  
          already exist", HttpStatus.CONFLICT.value(), null);
         return new ResponseEntity<String>(new Gson().toJson(apiResponse), HttpStatus.CONFLICT);
  }

 // ... rest of controller code 

如您所见,我使用Gson依赖项来创建JSON字符串。

答案 2 :(得分:0)

创建一个POJO,如下所示:

public class SuccessPOJO{
private String success;

.....
getters and setters
.....
}

现在您可以设置成功消息的值并返回此SuccessPOJO对象。在浏览器中,您将收到一个带有成功消息的JSON格式化对象!