Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用自定义参数注释返回自定义spring错误响应?_Java_Spring_Spring Mvc_Spring Boot_Spring Annotations - Fatal编程技术网

Java 如何使用自定义参数注释返回自定义spring错误响应?

Java 如何使用自定义参数注释返回自定义spring错误响应?,java,spring,spring-mvc,spring-boot,spring-annotations,Java,Spring,Spring Mvc,Spring Boot,Spring Annotations,我刚到春天,请原谅我的无知。 当给定的方法参数“required”为null时,我试图“返回”一个自定义响应。 spring的当前响应为: { "timestamp": 1477060294961, "status": 400, "error": "Bad Request", "exception": "org.springframework.web.bind.MissingServletRequestParameterException", "message": "Requ

我刚到春天,请原谅我的无知。 当给定的方法参数“required”为null时,我试图“返回”一个自定义响应。 spring的当前响应为:

{
  "timestamp": 1477060294961,
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.web.bind.MissingServletRequestParameterException",
  "message": "Required String parameter 'bookname' is not present",
  "path": "/getbook"
}
我试图达到一个它“返回”的点:

我认为这样做的一个好方法是有一个自定义的“参数注释”。这还将使代码更具可读性,并存储有关此端点参数的有用信息

我遵循了给出的示例,但我不确定在哪里或如何返回自定义响应

到目前为止,我有一个注释:

@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";
}
“端点”:

我还通过webConfig“注册”了此解析器:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(new CustomAnnotationResolver());
  }
}
@EnableWebMvc
@配置
公共类WebConfig扩展了WebMVCConfigureAdapter{
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
添加(新的CustomAnnotationResolver());
}
}

任何关于此实现的帮助或关于如何实现的任何其他建议都将是非常棒的。谢谢大家:)

如果您需要自定义
MissingServletRequestParameterException
处理,我会将此添加到控制器或控制器建议中:

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, Object> handleMissingParam(MissingServletRequestParameterException e) {


    Map<String, Object> result = new HashMap();

    result.put("status", Integer.toString(400));

    Map<String, String> error = new HashMap();
    error.put("param", e.getParameterName());

    result.put("error", error);
    return result;
}
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_请求)
公共映射句柄missingparam(MissingServletRequestParameterException e){
映射结果=新的HashMap();
result.put(“status”,Integer.toString(400));
映射错误=新建HashMap();
错误.put(“param”,例如getParameterName());
结果。输入(“错误”,错误);
返回结果;
}

当然,您可以用java对象替换
Map
的用法。我个人建议您使用原始错误处理,除非您有真正的原因。

如果您需要自定义
MissingServletRequestParameterException
处理,我会将此添加到控制器或控制器建议中:

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, Object> handleMissingParam(MissingServletRequestParameterException e) {


    Map<String, Object> result = new HashMap();

    result.put("status", Integer.toString(400));

    Map<String, String> error = new HashMap();
    error.put("param", e.getParameterName());

    result.put("error", error);
    return result;
}
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_请求)
公共映射句柄missingparam(MissingServletRequestParameterException e){
映射结果=新的HashMap();
result.put(“status”,Integer.toString(400));
映射错误=新建HashMap();
错误.put(“param”,例如getParameterName());
结果。输入(“错误”,错误);
返回结果;
}

当然,您可以用java对象替换
Map
的用法。我个人建议您使用原始错误处理,除非您有真正的原因。

谢谢@growlingchaos,太棒了,这是解决方案

@ControllerAdvice
@RestController
public class customExceptionAdvice {

  @ExceptionHandler(Exception.class)
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  public ResponseEntity handleConflict(BadRequestException e, HttpServletResponse response)
      throws IOException {

    return new ResponseEntity(e.getErrorBody(), HttpStatus.BAD_REQUEST);
  }

谢谢@growlingchaos,太棒了,这就是解决办法

@ControllerAdvice
@RestController
public class customExceptionAdvice {

  @ExceptionHandler(Exception.class)
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  public ResponseEntity handleConflict(BadRequestException e, HttpServletResponse response)
      throws IOException {

    return new ResponseEntity(e.getErrorBody(), HttpStatus.BAD_REQUEST);
  }

我可能会迟到,这是一个简单的例子,说明了如何捕捉rumtime错误并以简单的方式转换响应

平移控制器:

@ControllerAdvice
public class ExceptionTranslator {

private final Logger log = LoggerFactory.getLogger(ExceptionTranslator .class);

@ExceptionHandler(RuntimeException.class)
public ResponseEntity<ErrorDTO> processRuntimeException(HttpServletRequest req, RuntimeException ex) throws Exception {
    ErrorDTO errorDTO;
    ResponseStatus responseStatus = AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class);
    if (responseStatus != null) {
        errorDTO = new ErrorDTO(req.getRequestURI(), responseStatus.value().toString(), ex.getMessage());
    } else {
        errorDTO = new ErrorDTO(req.getRequestURI(), HttpStatus.INTERNAL_SERVER_ERROR.toString(), ex.getMessage());
    }
    log.debug(errorDTO.toString());
    return new ResponseEntity(errorDTO, HttpStatus.valueOf(Integer.valueOf(errorDTO.getCode())));
}
}

我可能会迟到,这是一个简单的例子,说明了如何捕捉rumtime错误并以简单的方式转换响应

平移控制器:

@ControllerAdvice
public class ExceptionTranslator {

private final Logger log = LoggerFactory.getLogger(ExceptionTranslator .class);

@ExceptionHandler(RuntimeException.class)
public ResponseEntity<ErrorDTO> processRuntimeException(HttpServletRequest req, RuntimeException ex) throws Exception {
    ErrorDTO errorDTO;
    ResponseStatus responseStatus = AnnotationUtils.findAnnotation(ex.getClass(), ResponseStatus.class);
    if (responseStatus != null) {
        errorDTO = new ErrorDTO(req.getRequestURI(), responseStatus.value().toString(), ex.getMessage());
    } else {
        errorDTO = new ErrorDTO(req.getRequestURI(), HttpStatus.INTERNAL_SERVER_ERROR.toString(), ex.getMessage());
    }
    log.debug(errorDTO.toString());
    return new ResponseEntity(errorDTO, HttpStatus.valueOf(Integer.valueOf(errorDTO.getCode())));
}
}

如果您想轻松处理去响应,可以使用@ControllerAdvice的传输控制器;此aproach捕获您想要处理的rumtime异常,并根据errorDTO对象创建一个自定义错误响应,该对象具有您需要显示的属性。因此,我是否应该在resolveArgument(){}中抛出一个错误,并按照您的建议捕获它。?你能举个例子吗?很明显,我有点迷路了。它看起来像是spring敲打了我在500错误中抛出的任何东西。要自定义错误状态的主体,可以在
@ControllerAdvice
@ExceptionHandler
中返回自定义java bean。你可以看看我写的。如果你想轻松处理反响应,你可以使用@ControllerAdvice;此aproach捕获您想要处理的rumtime异常,并根据errorDTO对象创建一个自定义错误响应,该对象具有您需要显示的属性。因此,我是否应该在resolveArgument(){}中抛出一个错误,并按照您的建议捕获它。?你能举个例子吗?很明显,我有点迷路了。它看起来像是spring敲打了我在500错误中抛出的任何东西。要自定义错误状态的主体,可以在
@ControllerAdvice
@ExceptionHandler
中返回自定义java bean。你可以看看我写的。
public class ErrorDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    private final String uri;
    private final String code;
    private final String description;

    public ErrorDTO(String message) {
        this(null, message, null);
    }

    public ErrorDTO(String uri, String code, String description) {
        this.uri = uri;
        this.code = code;
        this.description = description;
    }

    public String getUri() {
       return uri;
    }

    public String getCode() {
       return code;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return "ErrorDTO{" + "uri=" + uri + ", code=" + code + ", description=" + description + '}';
    }
 }