Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ResponseAdvice没有被触发_Java_Spring_Spring Boot_Aspect - Fatal编程技术网

Java ResponseAdvice没有被触发

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

这方面有很多问题,但几乎没有有效的解决方案

这只是带有@ControllerAdvice的ResponseDevice的一个简单实现

控制器

@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
,那么即使是您不希望被截取的方法也会被截取。不管怎样,只要它符合您的目的,它应该是好的,但如果您有方法,您不希望调用它,它仍然会被调用。