2011-12-21 94 views
21

我有一个自定义异常类注释返回给定HttpStatus在Spring 3中,是否可以动态设置@ResponseStatus的原因?

@ResponseStatus(value=HttpStatus.BAD_REQUEST, reason="Invalid parameter") 
public class BadRequestException extends RuntimeException 
{ 
    public BadRequestException(String msg) 
    { 
    super(msg); 
    } 
} 

此,当我从我的控制器抛出BadRequestException但原因始终是当然的“无效参数”的作品。有没有办法在这个类中设置返回的原因?我想传递一个字符串作为原因。

谢谢!

回答

12

您可以使用response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid foo");

+0

简单而有效 - 谢谢! – Paul 2011-12-21 20:51:24

+0

什么是响应? – user3871754 2016-10-17 15:35:08

+0

@ user3871754,可以在控制器方法中获得“响应”。 @ Bozho的说法是,我不应该在我的控制器方法中抛出异常,而应该调用'response.sendError'。 – Paul 2017-05-23 16:31:02

-2

“原因”是可选的,所以你可以省略它并实现抽象方法public String reason传递Error。 链接:http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/ResponseStatus.html

+0

你是什么意思*“并实现了抽象方法public String reason传递错误”*?我不认为只给OP的'public class BadRequestException extends RuntimeException'添加一个'reason'或'getReason'方法会允许动态设置一条消息? – Arjan 2013-02-04 15:33:03

2

注解意味着是静态的,并且不能从你的类动态设置。我建议为每种类型的故障情况创建一个BadRequestException的子类,并对它们进行不同的注释。

这不只是作为一种解决方法 - 如果你隐藏了有关什么地方出了错在reason消息,那么你就失去了灵活性,因为能够抓住一个BadRequestException任何代码都必须处理所有的细节失败情况也是如此。

+0

在这种情况下,最终处理异常的代码必须以相同的方式处理它...控制器响应来自JavaScript前端的异步请求。在任何 – Paul 2011-12-21 20:00:42

+1

我明白你的意思。我仍然认为这是一个好的设计,没有任何伤害(除了引入几个比你已经拥有的更多的Exception类),但是如果你倾向于尝试不同的路线,Bozho提到的方法和/或描述的方法这可能是有用的:http://forum.springsource.org/showthread.php?100267-Changing-ResponseStatus-from-within-controller-method。希望有所帮助! – 2011-12-21 20:21:25

11

正确的方法是在你的控制器引入异常处理程序,那么你可以设置任何状态码响应体:

@Controller 
@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE) 
public class SomeController { 
... 
    @ExceptionHandler(BadRequestException.class) 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    public @ResponseBody 
    Map<String,Object> handleIndexNotFoundException(BadRequestException bre, 
              HttpServletRequest request, HttpServletResponse resp) { 
    HashMap<String, Object> result = new HashMap<>(); 
    result.put("error", true); 
    result.put("error_message", bre.getMessage()); 
    return result; 
    } 
} 

动过你没有任何污染模型/异常类Spring Web MVC注释和依赖。

如果您想与所有控制器共享处理程序,请查看@ControllerAdvice

+0

问题是关于设置原因短语,而不是正文。 – Jakub 2016-03-15 11:06:04

1

设置response.setStatus()的最简单方法。简单而干净,您可以将其更改为任何您想要的状态,而不是ex.getStatusCode()添加您的代码。

返回类型也是你的选择,我用字符串b/c稍后显示。

顺便说一下,sendError不是一个好主意,因为JBoss为响应添加了很多HTML。

@ExceptionHandler(CommunicationException.class) 
@ResponseBody() 
public String handleCommunicationException(CommunicationException ex, HttpServletResponse response) throws IOException{ 
    response.setStatus(ex.getStatusCode()); 
    return ex.getStatusMessage(); 
} 
8

如果忽略在一个自定义异常的@ResponseStatus注释的“理由”属性,

@ResponseStatus(value = HttpStatus.CONFLICT) // 409 
public class ChildDataExists extends RuntimeException { 
... 

然后抛出异常

throw new ChildDataExists("Can't delete parent if child row exists."); 

异常的消息出现过的JSON输出中'data'的'消息'。看起来注解中的“原因”会覆盖自定义行为。

+0

呵呵,似乎我几次都不知道这个功能。谢谢! – Mateusz 2017-01-26 16:45:22

+2

没有为我工作。我将状态码设置为BAD_REQUEST(400),但在错误和消息字段中都收到了“错误的请求”。即使异常消息是在我的异常对象中设置的。 – 2017-06-30 11:21:11

+0

这很好用。谢谢。这是非常容易,然后有特殊的渔获投掷错误。 – gcerkez 2017-08-01 19:04:01

相关问题