我是新来的春天,所以请原谅我的无知。 我试图“返回”自定义响应时,给定的方法参数,这是“必需”,为空。 当前响应,从春季是:如何使用自定义参数注释返回自定义弹簧错误响应?
{
"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一个trasnlation控制器;这个aproach会捕捉你想要处理的rumtime异常,并根据你需要创建一个自定义错误响应,并以errorDTO objet和你需要显示的属性为基础。 – johnnynemonic
所以我应该在resolveArgument(){}中抛出一个错误,并且按照你的建议抓住它。你能提供一个例子吗?我有点失落,这一点很明显。无论我在500错误中抛出什么,它看起来像春天的rap。 –
要为错误状态自定义主体,您可以在'@ ControllerAdvice'的'@ ExceptionHandler'中返回一个自定义java bean。你可以看看[这个小例子](https://github.com/growlingchaos/update-msg/blob/custom-error/src/main/java/org/damage/rest/GeneralExceptionAdvice.java)我写的。 – growlingchaos