Java ResponseAdvice没有被触发
这方面有很多问题,但几乎没有有效的解决方案 这只是带有@ControllerAdvice的ResponseDevice的一个简单实现 控制器Java ResponseAdvice没有被触发,java,spring,spring-boot,aspect,Java,Spring,Spring Boot,Aspect,这方面有很多问题,但几乎没有有效的解决方案 这只是带有@ControllerAdvice的ResponseDevice的一个简单实现 控制器 @RestController @ReqeustMapping("/test") class TestController{ @RequestMapping( method=GET ) public String test(){ return "Test"; } } 建议 @RestControllerAdvice public class
@RestController
@ReqeustMapping("/test")
class TestController{
@RequestMapping( method=GET )
public String test(){ return "Test"; }
}
建议
@RestControllerAdvice
public class ResponseDecorator implements ResponseBodyAdvice<String> {
@Autowired
ObjectMapper mapper;
@Override
public boolean supports(MethodParameter returnType,
Class<? extends HttpMessageConverter<?>> converterType) {
return returnType.getParameterType().equals(String.class);
}
@Override
public String beforeBodyWrite(String body,
MethodParameter returnType,
MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request,
ServerHttpResponse response) {
System.out.println ( "Just print this when before sending ");
return body;
}
}
@RestControllerAdvice
公共类ResponseDecorator实现ResponseBodyAdvice{
@自动连线
对象映射器映射器;
@凌驾
公共布尔支持(MethodParameter returnType,
类>转换器类型){
返回returnType.getParameterType().equals(String.class);
}
@凌驾
BodyWrite之前的公共字符串(字符串体,
MethodParameter返回类型,
MediaType选择内容类型,
Class>selectedConverterType,
ServerHttpRequest请求,
服务器HttpResponse(响应){
System.out.println(“发送前只需打印即可”);
返回体;
}
}
BodyWrite之前的根本不会触发。该应用程序完全由注释驱动。建议和控制器都在同一个包中。我错过了什么 好的。愚蠢的错误。这里的问题是支持方法
@Override
public boolean supports(MethodParameter returnType,
Class<? extends HttpMessageConverter<?>> converterType) {
return returnType.getParameterType().equals(String.class);
}
@覆盖
公共布尔支持(MethodParameter returnType,
类>转换器类型){
返回returnType.getParameterType().equals(String.class);
}
使此方法返回TRUE已修复此问题
@Override
public boolean supports(MethodParameter returnType,
Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@覆盖
公共布尔支持(MethodParameter returnType,
类>转换器类型){
返回true;
}
supports方法应返回true。因此,请根据您的需求调整您的逻辑。如果我们查看ResponseBodyAdvice的Javadoc,可能会有一些细节导致您的设置无法正常工作。回到基础,也许可以通过返回ResponseEntity和使用@ControllerAdvice进行探索。我怀疑您可能也需要将控制器注释更改为@controller。没有尝试过自己,所以我不认为这是因为答案可能是弹簧靴版本,你有。我在Spring boot
v2.1.9.RELEASE上也尝试了同样的方法,但没有任何变化,它工作得很好。@Jayr尝试了一切。。不change@MadhuBhat尝试使用2.1.9。一样。。不工作。您介意在github中共享您的代码吗?@MadhuBhat谢谢。事实上,我单独试了一个,效果非常好。奇怪的是为什么我的应用程序不工作。猜猜看?这不是一个补丁,而是一个黑客。因为这会使ResponseDecorator
截获每一个方法。这不是黑客行为。答案是supports方法应该返回true。编辑我的回答我之所以说这是一个黑客行为,是因为supports方法覆盖是为了指定哪些方法应该被通知拦截。如果您只是返回true
,那么即使是您不希望被截取的方法也会被截取。不管怎样,只要它符合您的目的,它应该是好的,但如果您有方法,您不希望调用它,它仍然会被调用。