【问题标题】:Intecepting Rest Controller responses接收 Rest Controller 响应
【发布时间】:2015-09-27 17:16:58
【问题描述】:

我正在使用 Spring Boot 构建 REST 服务。我的控制器带有 @RestController 注释。出于调试目的,我想拦截每个控制器方法生成的ResponseEntity(如果可能)。然后我希望构建一个新的ResponseEntity,它在某种程度上基于控制器生成的ResponseEntity。最后,新生成的ResponseEntity 将替换控制器生成的ResponseEntity,并作为响应的一部分返回。

我只希望在调试应用程序时能够做到这一点。否则我希望控制器生成的标准响应返回给客户端。

例如我有控制器

@RestController
class SimpleController

    @RequestMapping(method=RequestMethod.GET, value="/getname")
    public NameObject categories()
    {
        return new NameObject("John Smith");
    }
}

class NameObject{
    private String name;
    public NameObject(name){
        this.name = name;
    }
    public String getName(){ return name; }
}

这将生成响应:

{"name" : "John Smith"}

但我想更改响应以包含实际响应的状态信息,例如:

{"result": {"name" : "John Smith"}, "status" : 200 }

任何指针表示赞赏。

【问题讨论】:

标签: java spring spring-mvc spring-boot


【解决方案1】:

我尝试实现这种功能的方法是首先创建一个拦截器。可以找到例子here

其次,我将使用 Spring 配置文件来确保拦截器仅加载到我需要它的配置文件中。详细信息here。这不是精确的调试,但可能会奏效。

【讨论】:

  • 您的第一个链接与第二个链接的目的地相同。
  • 很抱歉。固定。
【解决方案2】:

你可以使用 spring AOP 来做到这一点,比如:

@Aspect
@Component
public class ResponseEntityTamperer {
    @Around("execution(* my.package.controller..*.*(..))")
    public Object tamperWithResponseEntity(ProceedingJoinPoint joinPoint)
                  throws Throwable {
        Object retVal = joinPoint.proceed();
        boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean()
                             .getInputArguments().toString()
                             .contains("jdwp");

        if(isDebug && retVal instanceof ReponseEntity) {
            // tamper with the entity or create a new one
        }
        return retVal;
    }
}

“找出我们是否处于调试模式”代码来自this answer

【讨论】:

    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 2018-03-24
    • 2013-08-26
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 2022-01-20
    相关资源
    最近更新 更多