【发布时间】:2017-03-31 20:48:25
【问题描述】:
我是春天的新手,所以请原谅我的无知。 当“必需”的给定方法参数为空时,我试图“返回”自定义响应。 来自 spring 的当前响应是:
{
"timestamp": 1477060294961,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.web.bind.MissingServletRequestParameterException",
"message": "Required String parameter 'bookname' is not present",
"path": "/getbook"
}
我正试图达到它“回归”的地步:
{
"status": 400,
"error": {
// custom error body
}
}
我认为这样做的一个好方法是有一个自定义的“参数注释”。这也将使代码更具可读性并存储有关此端点参数的有用信息。
我按照here 给出的示例进行操作,但我不确定在哪里或如何返回自定义响应?
到目前为止我有注释:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface customParameter {
String value() default "";
boolean required() default false;
String defaultValue() default ValueConstants.DEFAULT_NONE;
String customInfo() default "blar blar";
}
“端点”:
@RequestMapping(value = "/getbook", method = {RequestMethod.POST})
public ResponseEntity<BookResponse> getBookInfo(
@customParameter(value = "bookname", required = true, customInfo = "extremely valuable book")
final String bookname
) {
return new bookRequest(bookname).getResponse;
}
并有一个自定义解析器:
public class CustomAnnotationResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(customParameter.class) != null;
}
@Override
public Object resolveArgument(MethodParameter methodparameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
CustomParameter customParameter = methodparameter.getParameterAnnotation(CustomParameter.class);
String parameter = webRequest.getParameter(CustomParameter.value());
// todo: do Validation here
if (customParameter == null) {
if (Parameter.required()) {
String customInfo = customParameter.customInfo();
String body getBody(customInfo);
new ResponseEntity(body, 400); // so the problem is here!! how do I return this response??
}
}
return webRequest.getParameter(customParameter.value());
}
}
我还用 webConfig“注册”了这个解析器:
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new CustomAnnotationResolver());
}
}
对此实现的任何帮助或有关如何执行此操作的任何其他建议都会很棒。谢谢大家:)
【问题讨论】:
-
如果您想轻松处理响应,您可以使用@ControllerAdvice 使用翻译控制器;这种方法捕获您想要处理的 rumtime 异常,并根据您需要显示的属性基于 errorDTO 对象创建您想要的自定义错误响应。
-
所以我应该在 resolveArgument(){} 中抛出一个错误并按照您的建议捕获它吗?您能否提供示例,我有点迷茫,这很明显。无论我在 500 错误中抛出什么,它看起来就像弹簧说唱。
-
要为错误状态自定义正文,您可以在
@ControllerAdvice的@ExceptionHandler中返回自定义Java bean。你可以看看我写的this little example。
标签: java spring spring-mvc spring-boot spring-annotations