捕获Spring中PropertyEditors抛出的IllegalArgumentException

时间:2011-01-25 12:53:05

标签: java spring spring-mvc

我有 PropertyEditor ,以便将ID转换为 Persons ,并使用setAsText(String text),如下所示:

public void setAsText(String text) throws IllegalArgumentException {
    try {
        int id = Integer.parseInt(text);
        Person person = peopleService.get(id);
        this.setValue(person);
    }
    catch (NumberFormatException ex) {
        // ...
        throw new IllegalArgumentException("Not a number!: " + text);
    }
    catch (PersonNotFoundExcetion ex) {
        // ...
        throw new IllegalArgumentException("Impossible to get Person: " + text);
    }
}

我的PeopleController有一个方法如下:

@RequestMapping("/getPerson")
public void ver (@RequestParam Person person, Model model) {
    model.addAttribute (person);
    // ...
}

我想捕获IllegalArgumentException以向用户显示友好的消息,例如“抱歉,您正在寻找的人不在这里”,但我不知道该怎么做...

谢谢!

2 个答案:

答案 0 :(得分:4)

可以通过以下方式进行常规异常处理:

@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleAllExceptions(Exception e) {
  return "redirect:/error.html"; /* use the correct view name */
}

您可以使用BindingResult

更具说明性
@RequestMapping(value = "/datedata", method = RequestMethod.POST)
public String create(
    @ModelAttribute("datedata") final DateData datedata,
    final BindingResult result) {

    if (result.hasErrors()) {
        return "datedata/create";
    } else {
        ...
        return "myView";
    }
 }

但我想这只适用于“Forms”(ModelAttribute)

我认为让Spring处理属性编辑器对用户输入的验证并不是一个好主意。我强烈建议使用Form方式:使用STRING字段构建命令对象并在其上使用验证器。

答案 1 :(得分:1)

应该在控制器中捕获异常。它永远不会泄漏给视图和最终用户。

如果这是一个Web应用程序,我建议使用验证和绑定API而不是PropertyEditor。这将允许您返回可用于告知UI需要更正的错误。

您的异常处理需要工作。我不建议捕捉异常,除了包装和重新投掷之外什么都不做。这不是处理任何事情或添加新信息。它实际上编码的信息较少。