AOP @Around:返回BAD_REQUEST响应 [英] AOP @Around: return BAD_REQUEST response
问题描述
在Spring rest应用程序中,每个URL都必须以应用程序ID(appId)开头.必须在每个单独的REST服务中验证此appId.我尝试使用@Around建议创建一个@Aspect,而不是复制代码.可以在执行任何rest方法之前正确执行此操作.
In a Spring rest application, every single URL must start with an application id (appId). This appId must be validated in every single rest service. Instead of duplicating code, I tried to create an @Aspect with an @Around advice. This is correctly executed before any rest method.
但是,如果应用程序ID未知,我既不想创建堆栈跟踪,也不想返回200(响应确定).相反,我确实想返回一个BAD_REQUEST响应代码.
However, if the application id is unknown, I do not want neither to create a stack trace or neither to return a 200 (response OK). Instead I do want to return a BAD_REQUEST response code.
如果我在建议中抛出异常,则会得到堆栈跟踪,并且没有HTTP响应.另一方面,如果我返回其他任何内容(但不调用pjp.proceed),则返回码为200.
If I throw an exception in my advice, I get a stack trace and no HTTP response. If I on the other hand return anything else (but do not call the pjp.proceed), I get a return code of 200.
任何人都可以帮助我将响应码400返回给请求者吗?
Could anyone please assist me on returning a response code 400 to the requestor?
到目前为止,我的代码如下:
Below my code so far:
@Component
@Aspect
public class RequestMappingInterceptor {
@Autowired
ListOfValuesLookupUtil listOfValuesLookupUtil;
@Around("@annotation(requestMapping)")
public Object around(ProceedingJoinPoint pjp, RequestMapping requestMapping) throws Throwable {
Object[] arguments = pjp.getArgs();
if(arguments.length == 0 || !listOfValuesLookupUtil.isValidApplication(arguments[0].toString())) {
// toto : return bad request here ...
throw new BadRequestException("Application id unknown!");
} else {
return pjp.proceed();
}
}
}
推荐答案
您需要访问 HttpServletResponse
并将其用于发送错误代码.您可以通过 RequestContextHolder
You need to access the HttpServletResponse
and use that to send the error code. You can do this via the RequestContextHolder
@Around("@annotation(requestMapping)")
public Object around(ProceedingJoinPoint pjp, RequestMapping requestMapping) throws Throwable {
Object[] arguments = pjp.getArgs();
if(arguments.length == 0 || !listOfValuesLookupUtil.isValidApplication(arguments[0].toString())) {
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse());
response.sendError(HttpStatus.PRECONDITION_FAILED.value(), "Application Id Unknown!");
return null;
} else {
return pjp.proceed();
}
}
这篇关于AOP @Around:返回BAD_REQUEST响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!