我想从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();
}
答案 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,那么
您只需返回具有Serializable - 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
格式化对象!