当前位置: 首页 > 知识库问答 >
问题:

SpringBoot:将控制器响应包装到另一个对象中

公冶鸣
2023-03-14

考虑下面的控制器方法,

@GetMapping("/getdata")
public Data getDetails() {
                
    try {
        Data obj = template.getForObject("http://localhost:8090/details/get", Data.class);
        return obj; 

    } catch (Exception e) {
        .....
    }       
}

假设上面endpoint的响应对象如下所示,

data : {
 name : "ABCD",
 age  : "20"
}

现在我试图实现的是将整个响应对象包装在另一个对象下,因此最终响应应该看起来像,

{
   status : "SOMETHING",
   response : {
     name : "ABCD",
     age  : "20"
   },
   extra : null
}

所以问题是,我不想在每个控制器方法下创建一个函数来向这个包装器对象发送值。我的问题是,在Spring框架中是否有可能允许我在某个地方创建一个全局包装器函数,它会自动选择它并包装来自控制器的响应?

共有1个答案

姬弘文
2023-03-14

您需要以@ControllerAdvice的形式实现一个ResponseBodyAdvice。首先,您需要有一个通用响应的模型。

public class GenericResponse<T> {
    private String status;
    private String extra;
    private T response;
}

然后您需要实现ResponseBodyAdvice本身:

@ControllerAdvice
public class CustomResponseBodyAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object response, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
                                  ServerHttpResponse response) {    
        GenericResponse<Object> genericResponse = new GenericResponse<>();
        output.setStatus("SOMETHING"); // I guess that you need some logic here
        output.setResponse(response);
        return genericResponse;
    }
}
 类似资料:
  • 我有两个控制器。两者都是映射后endpoint。 在第一个控制器(Controlller1)使所有我需要的对象,我想调用/重定向第二个控制器,以便继续,然后从它得到响应。 我尝试过使用RestTemplate,但总是会出现405错误。我在某个地方读到,这是因为多部分 问题是,如何调用第二个endpoint?

  • 这是我试图实现的:我有许多SpringRest无功控制器返回各种对象,如单声道,通量 我想将所有这些响应包装在响应实体中,因此总是返回这样的内容: 有什么建议吗?

  • 问题内容: 我有以下两个对等控制器。这些没有父项: 在控制器1中,我想更新由Controller2控制的HTML中的变量xxx的值。有办法吗? 问题答案: 绝对使用服务在控制器之间共享数据,这是一个有效的示例。$ broadcast不是要走的路,您应该避免在有更合适的方式时使用事件系统。使用“服务”,“值”或“常量”(用于全局常量)。 http://plnkr.co/edit/ETWU7d0O8K

  • 我必须用不同的键和值将rest模板响应映射到我的DTO。目前我正在从rest api获得这个json响应 我想将其映射到我的 DTO 中,以便能够保存到数据库中 我想要的是只获得相同的动态密钥,以匹配上述api的响应。目前我正在这样做,但似乎我没有设置相同键的正确值。 执行此操作后,我的数据库中出现空值。

  • 问题内容: 我是Angular的新手,正在尝试弄清楚该怎么做… 使用AngularJS,如何注入要在另一个控制器中使用的控制器? 我有以下片段: 执行此操作时,出现错误: 我是否应该尝试在另一个控制器内部使用一个控制器,还是应该将此服务用作服务? 问题答案: 如果您打算掌握已经实例化的另一个组件的控制器,并且如果您遵循的是基于组件/指令的方法,则始终可以遵循某个层次结构的另一个组件中的控制器(一个

  • 我是JavaFx新手,因此我找不到解决问题的方法 假设我有以下应用程序结构: 在SecondController中显示文本的最佳/最佳方式是什么,从FirstController传递文本。我的意思是,我在中输入一个文本,然后按下按钮,按下按钮后,我希望文本显示在使用另一个控制器的中。我已经阅读了很多关于和可以用来解决这个问题的知识,但不幸的是,我无法实现一个有效的解决方案。 如果你们专家能在这方面