我想在spring boot中,当响应对象对于每个响应自动为null时返回404。
我需要建议。
我不想检查控制器中的对象是否为null。
与@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;
}
}
在Spring中实现这一点的最简单方法是编写自己的异常类,如下所示
@ResponseStatus(value = HttpStatus.NOT_FOUND)
class ResourceNotFoundException extends RuntimeException{
}
然后从任意位置抛出ResourceNotFoundException。
if (something == null) throw new ResourceNotFoundException();
更多-
您需要多个Spring模块来完成此操作。基本步骤是:
步骤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/副本。我做错了什么?