当前位置: 首页 > 知识库问答 >
问题:

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

司空祯
2023-03-14

我想从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();


}

共有1个答案

高琛
2023-03-14

所以基本上您想要做的是生成2个POJO

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;
    }
}
  • https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody
  • 在此RESTful应用程序示例中Spring@ResponseBody注释究竟是如何工作的?
  • 对于@restcontroller,spring@controller和@restcontroller Annotation
 类似资料:
  • 问题内容: 我已经使用像这样的控制器构建了json REST服务: 它工作正常,但现在我需要修改所有响应,并向所有响应添加“状态”和“消息”字段。我已经阅读了一些解决方案: 从某个特定类的所有控制器方法对象返回,例如RestResponse,它将包含“ status”和“ message”字段(但这不是通用解决方案,因为我将不得不修改所有控制器并以新样式编写新控制器) 截取具有方面的所有控制器方法

  • 我正在spring boot中编写RESTAPI-s。我想确保我的代码对于使用swagger API开发工具(swagger)的前端开发人员是可读的。例如 如果请求成功,响应是一个分支对象,如果失败,响应是只有一个属性(消息)的FindError对象。因此,这两种方法的执行取决于响应。但是swagger UI没有显示响应应该如何显示,因为我使用了“?”作为泛型类型。这是捕捉错误的最佳实践吗?(这种

  • 我用这样的控制器构建了一个json REST服务: 它工作得很好,但是现在我需要修改所有的响应,并为它们添加“状态”和“消息”字段。我读过一些解决方案: 从所有控制器方法返回某个特定类的对象,例如RestResponse,它将包含“状态”和“消息”字段(但这不是通用解决方案,因为我必须修改所有控制器并以新样式编写新控制器) 拦截所有带有方面的控制器方法(但在这种情况下,我无法更改返回类型) 如果我

  • 我可以在POST请求时发送对象列表作为响应,并在VueJs客户端中接收它 但是当我尝试用自定义类响应时(我甚至在请求映射注释中添加了) 在axios的帮助下发送VueJs端请求。邮递 Vue用户界面客户端接收 为什么我可以用对象列表响应而不能用POJO响应,以及如何解决这个问题?非常感谢。 PS.项目依赖于jackson-数据库v2.8.2和Spring v4.3.1

  • 问题内容: 我正在编辑内置的表单。 我在对话框中显示该表单,然后提交。 数据已正确输入数据库。 但是我不知道是否需要将一些寄回。其实我对事情有点困惑。 假设我在表中使用``jQuery添加了一行,当我提交表单时,然后在提交数据之后,我想发回那些行数据,以便我可以动态添加表行以显示添加的数据。 我很困惑如何获取这些数据。 这是我当前的代码: 这只是带有成功消息的模板。 问题答案: Symfony 2

  • 我试图将JSON发送到Spring MVC控制器。在Spring MVC方面,所有的配置都是正确的。 下面是代码,但似乎没有运行: 你知道我哪里出错了吗?我对JSON是新手。我试图将JSON发送到Spring MVC控制器。 当调用/application/run/save时,我会得到一个JSON响应。但是,@RequestBody不能工作。 我还是没有运气。读过一些很多类似的问题。需求是服务器将