使用JavaScript UI处理SpringMVC错误

使用JavaScript UI处理SpringMVC错误,javascript,jquery,spring-mvc,kendo-ui,Javascript,Jquery,Spring Mvc,Kendo Ui,我有一个SpringMVC 3.2服务,它有一个HTML/endoUI,我无法将消息返回给它。我填充的RequestAttributes似乎对Javascript不可见。我看到的所有SpringMVC错误处理示例都使用html或jsp重定向 以下是一个示例: @Controller @RequestMapping( "/officeSignUp" ) public class OfficeSignUpController .. @RequestMapping( value = "/stepOne

我有一个SpringMVC 3.2服务,它有一个HTML/endoUI,我无法将消息返回给它。我填充的RequestAttributes似乎对Javascript不可见。我看到的所有SpringMVC错误处理示例都使用html或jsp重定向

以下是一个示例:

@Controller
@RequestMapping( "/officeSignUp" )
public class OfficeSignUpController
..
@RequestMapping( value = "/stepOne", method = RequestMethod.POST )
@ResponseBody
public String officeCreationStepOne( @Valid @ModelAttribute( "officeSetup" ) OfficeSetup officeSetup,
        BindingResult result, Model model, RedirectAttributes attributes ) {
    String results;

    results = newOfficeValidator.validateStepOne( officeSetup, result );

    NewCustomerSignup newCustSignup = newOfficeValidator.validateNewOwner( officeSetup );

    model.addAttribute( newCustomerSignupRepository.save( newCustSignup ) );

    return results;

}
我的验证器是:

@组成部分 公共类NewOfficeValidator{

public String validateStepOne( OfficeSetup officeSetup, BindingResult result ) {

List<String> errors = new ArrayList<String>();
if (result.hasErrors()) {
    for (ObjectError error : result.getAllErrors()) {
        errors.add( error.getDefaultMessage() );
    }
    errors.add( "redirect: " + VIEW_STEP_ONE );
           // RuntimeException with a list of strings in it
    throw new OfficeSetupException( errors, "Validation in StepOne" );
  }


    return VIEW_STEP_TWO;
}

因此,最终我的问题是:从spring mvc向javascript前端返回验证或其他错误消息的最佳方式是什么?我正在尝试使用JSON进行响应,因此我希望错误消息会以这种方式返回。

在我的项目中,我按照您描述的方式执行-抛出异常并用@ExceptionHan捕捉它dler。但您不需要只返回字符串消息。创建您自己的异常类,该类可以将错误映射或错误列表作为参数(或任何其他要用作错误模型的参数)。发生错误时,填充自定义执行选项(我们称之为RequestException)错误将存储在您的exeception实例中。在RequestException的@ExceptionHandler中,从异常对象获取错误,然后以方便您的方式返回前端。

我想我通过添加“@JsonAutoDetect”解决了这个问题除了我的例外,我正在使用Java配置,因此下面的代码似乎处理HTTP响应代码并返回JSON响应

@JsonAutoDetect( fieldVisibility = Visibility.DEFAULT, getterVisibility = Visibility.DEFAULT, isGetterVisibility = Visibility.DEFAULT )
public class OfficeSetupException extends RuntimeException {

    private List<String> errors;

    private static final long serialVersionUID = -1L;

    public OfficeSetupException( List<String> errors, String message ) {
        super( message );
        this.errors = errors;
    }

    public List<String> getErrors() {
        return errors;
    }

}
@JsonAutoDetect(fieldVisibility=Visibility.DEFAULT,getterVisibility=Visibility.DEFAULT,isGetterVisibility=Visibility.DEFAULT)
公共类OfficeSetupException扩展RuntimeException{
私有列表错误;
私有静态最终长serialVersionUID=-1L;
public OfficeSetupException(列表错误、字符串消息){
超级(信息);
这个。错误=错误;
}
公共列表getErrors(){
返回错误;
}
}

我已经用@ExceptionHandler更新了我的帖子,并在UI上收到了实际的错误消息。出于某种原因,实际的异常似乎是从那里引发的,而不应该是这种情况。您可以验证handleOfficeSetupException是否确实被调用并在ValidateSpone中引发异常后执行吗OfficeSignUpController类扩展BaseController?(我假设是,但它在发布的代码中不可见)是的,我可以单步执行并看到BaseController处理异常,然后该异常解析错误并返回错误消息。UI收到400(通过FireBug确认)以及Tomcat错误。当您发布请求时,请求中的Accept header设置为“application/json”?当officeCreationStepOne中的验证未失败时,您是否正常得到结果(例如,使用@ResponseBy返回对象并接收json是否适用于应用程序中的其他位置)?能否将日志级别设置为跟踪,并查看日志中是否存在任何异常?我不确定我是否遵循。我没有明确声明我正在接收或发送的内容。我正在接收表单提交,这似乎工作正常。在其他地方,我返回JSON时没有声明它为“products=MediaType.APPLICATION\u JSON\u VALUE”。但这是我唯一一次真正尝试处理从BaseController返回的响应。我注意到您在用@ResponseBy注释的处理程序方法中使用了model.addAttribute(…)。这是为什么?(model用于访问视图中的数据,但您没有使用视图)。
<h1>HTTP Status 400 - Received OfficeSetupException </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>Received OfficeSetupException </u></p><p><b>description</b> <u>The request sent by the client was syntactically incorrect (Received OfficeSetupException ).</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.27</h3></body></html>
if(stepString == "Step 2"){ click on step 2
       if(viewModelStepOne.validateStepOne(s) == true){ client side validation
           viewModelStepOne.saveStepOne(s);if above validation passes, send request to server,
       if(serverValidationFailed){if server returns error, do not move to step 2
            s.preventDefault();
       }else{ move to step 
          this.disable(this.tabGroup.children("li").eq(2),true);
          this.enable(this.tabGroup.children("li").eq(3),true);
       }
    }else{ s.preventDefault();
    }
}
@JsonAutoDetect( fieldVisibility = Visibility.DEFAULT, getterVisibility = Visibility.DEFAULT, isGetterVisibility = Visibility.DEFAULT )
public class OfficeSetupException extends RuntimeException {

    private List<String> errors;

    private static final long serialVersionUID = -1L;

    public OfficeSetupException( List<String> errors, String message ) {
        super( message );
        this.errors = errors;
    }

    public List<String> getErrors() {
        return errors;
    }

}