Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 感知Rest控制器响应_Java_Spring_Spring Mvc_Spring Boot - Fatal编程技术网

Java 感知Rest控制器响应

Java 感知Rest控制器响应,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,我正在使用SpringBoot构建一个REST服务。我的控制器用@RestController注释。出于调试目的,我想截取每个控制器方法生成的响应属性(如果可能)。然后,我希望构造一个新的响应属性,它在某种程度上基于控制器生成的响应属性。最后,新生成的ResponseEntity将替换控制器生成的属性,并作为响应的一部分返回 我只希望在调试应用程序时能够做到这一点。否则,我希望控制器生成的标准响应返回给客户端 例如,我有控制器 @RestController class SimpleContro

我正在使用SpringBoot构建一个REST服务。我的控制器用
@RestController
注释。出于调试目的,我想截取每个控制器方法生成的
响应属性
(如果可能)。然后,我希望构造一个新的
响应属性
,它在某种程度上基于控制器生成的响应属性。最后,新生成的
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 }

欢迎使用任何指针。

您可以使用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;
    }
}

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

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


其次,我将使用Spring概要文件来确保拦截器只在我需要的概要文件中加载。细节这不是一个简单的调试,但可能会起到作用。

您的第一个链接与第二个链接指向同一个目标。对此表示抱歉。修复。您的最佳选择可能是创建一个自定义的
HttpMessageConverter
,以拦截您的响应并将其包装到另一个具有状态代码的对象中。例如: