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

对于每个空响应返回404

通正平
2023-03-14

我想在spring boot中,当响应对象对于每个响应自动为null时返回404。

我需要建议。

我不想检查控制器中的对象是否为null。

共有3个答案

郑功
2023-03-14

与@manish的答案类似(https://stackoverflow.com/a/43891952/986160)但是没有AspectJ切入点,而是使用另一个@ControllerAdvice

步骤1:NotFoundException类:

public class NotFoundException extends RuntimeException {
    public NotFoundException(String msg) {
        super(msg);
    }
    public NotFoundException() {}
}

步骤2:检查endpoint中返回的主体是否为null,并抛出NotFoundException:

@ControllerAdvice
public class NotFoundAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    @SuppressWarnings("unchecked")
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if (body == null) {
            throw new NotFoundException("resource not found");
        }
        return body;
    }
}

步骤3:处理NotFoundExcture并使响应具有404的状态

@ControllerAdvice
public class GlobalExceptionAdvice {

    @Data
    public class ErrorDetails {
        private Date timestamp;
        private String message;
        private String details;

        public ErrorDetails(Date timestamp, String message, String details) {
            super();
            this.timestamp = timestamp;
            this.message = message;
            this.details = details;
        }
    }

    @ExceptionHandler(NotFoundException.class)
    public final ResponseEntity<ErrorDetails> notFoundHandler(Exception ex, WebRequest request) {
        ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(),
                request.getDescription(false));
        return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
    }
}

步骤3的备选方案:

您可以只注释您的NotFoundExc0019@响应状态和覆盖fillInStackTrace()(从https://stackoverflow.com/a/31263942/986160),使其具有类似的效果,以GlobalExceptionAdwn,并且不会显示这样的stackTrace:

@ResponseStatus(value = HttpStatus.NOT_FOUND,reason =  "resource not found")
public class NotFoundException extends RuntimeException {
    public NotFoundException(String msg) {
        super(msg);
    }
    public NotFoundException() {}

    @Override
    public synchronized Throwable fillInStackTrace() {
        return this;
    }
}
姜智渊
2023-03-14

在Spring中实现这一点的最简单方法是编写自己的异常类,如下所示

@ResponseStatus(value = HttpStatus.NOT_FOUND)
class ResourceNotFoundException extends RuntimeException{
}

然后从任意位置抛出ResourceNotFoundException。

if (something == null) throw new ResourceNotFoundException();

更多-

漆雕深
2023-03-14

您需要多个Spring模块来完成此操作。基本步骤是:

  1. 声明一个异常类,该类可用于在存储库方法未返回预期值时引发异常

步骤1:异常类

public class ResourceNotFoundException extends RuntimeException {}

步骤2:控制器建议

@ControllerAdvice
public class ResourceNotFoundExceptionHandler
{
  @ExceptionHandler(ResourceNotFoundException.class)
  @ResponseStatus(HttpStatus.NOT_FOUND)
  public void handleResourceNotFound() {}
}

第3步:建议

@Aspect
@Component
public class InvalidRepositoryReturnValueAspect
{
  @AfterReturning(pointcut = "execution(* org.example.data.*Repository+.findOne(..))", returning = "result")
  public void intercept(final Object result)
  {
    if (result == null)
    {
      throw new ResourceNotFoundException();
    }
  }
}

Github上提供了一个示例应用程序来演示所有这些功能。使用REST客户端(如Postman for Google Chrome)添加一些记录。然后,尝试通过标识符获取现有记录将正确返回记录,但尝试通过不存在的标识符获取记录将返回404

 类似资料:
  • 我想使用GooglePlaceAPI和自动完成视图。我有开发者控制台上的android和浏览器密钥。但当我尝试这些键API时,它返回空响应。 Logcat: D/Volley:[2651]a.a:请求的HTTP响应= 我的代码: 在onpostexecute日志中: 我是新来的google地方api,请帮我找到什么是错误的。

  • 我正在尝试调用FlickR API,但由于response.body()返回null而遇到困难。 我不确定它是否与我的JSON/POJO映射相关,但我无法弄清楚当我调用Flickr时如何访问来自改版的响应。我知道我的调用已经成功完成,因为我实际上能够通过日志拦截器查看JSON。 型号: 活动 }

  • 我想在Android应用程序发送包含 /api/Profile/Favorite的超文本传输协议请求时返回存根响应?value={"ID": 11821} 所以这是我的测试(使用WireMock框架) 但是当我开始测试方法测试发送请求浓缩咖啡时,我得到了正式服的生产响应。 这里请求来自Android设备: 这里回应: 正如你所看到的,我没有得到存根响应:{This_is_mock_response

  • 但是,当我返回列表时,就像这段代码: 对于完全相同的API的列表返回类型的响应是正确的响应: [{“SellingPrice”:23000,“ID”:1,“Version”:1,“CreatedOn”:“25Feb 2019,05:53”,“LastUpdatedOn”:“25Feb 2019,05:53”}]

  • 我正在尝试对远程服务器进行api调用,最初,我遇到以下错误:

  • 绑定到端口8080的Node.js express服务器 我希望通信量通过路由到服务到部署中的一个pods/副本。我做错了什么?