当前位置: 首页 > 知识库问答 >
问题:

在body exception spring rest添加新字段

韦业
2023-03-14

我想在我的Rest Spring Boot应用程序中处理异常。我知道使用@ControllerAdvice和ResponseEntity我可以返回一个表示错误的自定义对象,但我想要的是在exesting异常的主体中添加一个新字段,仅此而已。

@ResponseStatus(HttpStatus.CONFLICT)
public class CustomException extends RuntimeException {

    private List<String> errors = new ArrayList<>();

    public CustomException(List<String> errors) {
        this.errors = errors;
    }

    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, List<String> errors) {
        super(message);
        this.errors = errors;
    }

    public List<String> getErrors() {
        return errors;
    }

    public void setErrors(List<String> errors) {
        this.errors = errors;
    }
}

在我的控制器中,我只是这样抛出这个自定义异常:

@GetMapping("/appointment")
public List<Appointment> getAppointments() {
    List<String> errors = new ArrayList<>();
    errors.add("Custom message");
    throw new CustomException("This is my message", errors);
}

当我用postman测试我的Restendpoint时,似乎spring boot没有整理我的错误字段,响应是:

{
  "timestamp": "2017-06-05T18:19:03",
  "status": 409,
  "error": "Conflict",
  "exception": "com.htech.bimaristan.utils.CustomException",
  "message": "This is my message",
  "path": "/api/agenda/appointment"
}

如果我可以从异常获得“path”和“timestamp”字段,那么我可以使用@ControllerAdvice获得一个自定义对象,但这两个属性没有getter。

共有1个答案

赫连俊悟
2023-03-14

嗯!下面是DefaultErrorAttributes中“path”和“timestamp”的实现,您也可以在自定义实现中这样做:

路径:

String path = getAttribute(requestAttributes, "javax.servlet.error.request_uri");
if (path != null) {
    errorAttributes.put("path", path);
}

时间戳:

errorAttributes.put("timestamp", new Date());
@Bean
public ErrorAttributes errorAttributes() {
    return new DefaultErrorAttributes() {
        @Override
        public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
            Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace);
            // customize here
            return errorAttributes;
        }

   };
}
@Component
public class CustomErrorAttributes extends DefaultErrorAttributes {

    @Override
    public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
        Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace);
        // customize here
        return errorAttributes;
    }
}
{
   "timestamp": 1413883870237,
   "status": 500,
   "error": "Internal Server Error",
   "exception": "org.example.ServiceException",
   "message": "somthing goes wrong",
   "path": "/index"
}

可以使用@exceptionhandler自定义“exception”属性。@controleradvice可用于跨控制器通用地自定义异常。要在控制器级别进行自定义,可以将它们放置在控制器中。

在您的情况下:

   @ResponseStatus(value=HttpStatus.BAD_REQUEST, reason="Invalid Inputs")
    @ExceptionHandler(CustomException.class)
    private void errorHanlder() {
        //Log exception
    }


  public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
    Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace);
    Throwable error = getError(requestAttributes);
    if (error instanceof CustomException) {
        errorAttributes.put("errorList", ((CustomException)error).getErrors());
    }
    return errorAttributes;
}
 类似资料:
  • 要在DOMPdf中添加新字体Arvo,请更新文件DOMPdf\u font\u family\u cache.dist并添加以下代码- 我在lib/font目录中包含了字体文件,我在html中添加了样式表- 但新字体不会添加到结果pdf中。请帮我解决这个问题。

  • 我不得不向现有文档添加一个新字段/s。 下面是用于测试目的的过程AddNewField。 我做错了什么? 在调用fmongo.update后,我的收藏现在有两个文档!

  • 问题内容: 创建密钥后,是否可以向Python字典添加密钥?它似乎没有方法。 问题答案:

  • 我的团队在DynamoDB中添加了一个新字段,我需要为当前不包含该字段的所有条目添加一个整数。 我尝试在这里使用Update示例,但是我得到了一个,因为我的子句不包括主键。但是,我不需要按主键过滤,因为我只关心没有新列值的条目。 我正在运行的查询是PartiQL,它是:

  • 我使用iText将数据填充到PDF中现有的AcroForm字段中。 我现在正在寻找将新的AcroForm字段添加到PDF的解决方案。iText是否可以做到这一点?如果是,我该如何做到这一点?

  • 新建一个类EmailService, package为net.wendal.nutzbook.service ,内容如下 package net.wendal.nutzbook.service; public interface EmailService { boolean send(String to, String subject, String html); } 再新建一个实