【问题标题】:Java Spring: How to Get JSON/XML View from Controller on Forward or Redirect?Java Spring:如何在转发或重定向时从控制器获取 JSON/XML 视图?
【发布时间】:2015-03-03 17:02:35
【问题描述】:

我要做什么

我有一个 ControllerA,它需要将带有参数的请求转发或重定向(首选重定向)到 ControllerB。 ControllerB 在一个完全不同的 webapp 中,所以除了重定向之外,这些控制器都不知道另一个存在。

ControllerB 返回 JSON 或 XML 格式的视图。我想要发生的是 ControllerA 转发/重定向到 ControllerB,并显示从 ControllerB 生成的视图。

我这样做是因为给我的要求表明我应该尽量避免将 ControllerB 的应用程序中的任何内容集成到 ControllerA 的应用程序中。否则我会使用 RestTemplate 并将 ControllerB 的视图复制到 ControllerA 的应用程序中。

我目前所拥有的

这是控制器A:

@RequestMapping("/ControllerA")
public ModelAndView ControllerA(
        @RequestParam(value = "A", required = true) String A,
        @RequestParam(value = "B", required = false) Boolean B)
{
    RedirectAttributes redirectAttributes = new RedirectAttributesModelMap();
    redirectAttributes.addAttribute("A", A);
    redirectAttributes.addAttribute("B", B);

    String obj = "redirect:http://{host}:{port}/{appName}/ControllerB?A=A&B=B";
    return new ModelAndView(obj);
}

这是控制器B:

@RequestMapping("/ControllerB")
public ModelAndView ControllerB(
        @RequestParam(value = "A") String A,
        @RequestParam(value = "B", required = false) Boolean B
) 
{
    ControllerView cView
            = serviceService.service(A, B);

    return new ModelAndView("viewResolver", "object", cView);
}

我想要找回的示例

<Results A="A" B="B" numResultsReturned="1">
    <line data1="ABC" />
</Results>

什么不起作用

视图永远不会在重定向或转发时返回。 Spring 报告状态为 200 的转发或重定向 URL,然后尝试解析为 JSP。我可能做错了什么?

我在 SO 和网络上的其他地方看到的大多数问题似乎都对 JSP 或 HTML 页面使用了重定向/转发。我只是想获取 XML 或 JSON。

我知道我可能在这里要求 Spring 做一些它不应该做的事情。如果是这种情况,如果我想让 ControllerA 和 ControllerB 尽可能分开,我还有哪些其他选择?

【问题讨论】:

  • “我想要发生的是 ControllerA 转发/重定向到 ControllerB,并显示从 ControllerB 生成的视图”所以您希望 webapp A 生成一个视图,其中包含您从控制器 B 获得的结果?
  • @JohnDonn 我不希望 webapp A 生成任何东西。 webapp B 中的 ControllerB 以 XML 或 JSON 格式生成视图。我想要的是让 webapp A 能够获取在 ControllerB 中创建的视图并将其传递给客户端。

标签: java spring


【解决方案1】:

所以,我正在回过头来讨论这个问题,以便其他处于相同情况的人知道我做了什么来解决我的问题。这不是最优雅的解决方案,而且我肯定希望以另一种方式做到这一点,但它满足了我无法控制的要求

重申一下,这个想法是在两个应用程序/控制器不知道另一个应用程序/控制器的存在的情况下,将 XML 或 JSON 输出从一个 webapp 中的控制器获取到另一个 webapp 中的另一个控制器。我最初的方法是使用重定向或转发,但这些似乎更适合为 JSP/其他客户端页面提供服务,而不是提供 XML 或 JSON 内容。

什么对我有用

@RequestMapping("/workingController")
public void workingController(
        @RequestParam(value = "A", required = true) String A,
        @RequestParam(value = "B", required = false) Boolean B,
        @RequestParam(value = "format", required = false, defaultValue = "json") String format,
        HttpServletResponse response)
        throws IOException
{
    String applicationType = "application/json";

    if (format.equals("xml"))
    {
        applicationType = "text/xml";
    }

    String aResponse = new RestTemplate().getForObject(
            "http://{host}:{port}/{appName}/controllerExternal?A={A}&B={B}&format={format}",
            String.class, A, B, format);
    response.setContentType(applicationType);
    response.setContentLength(aResponse.length());
    response.getOutputStream().write(aResponse.getBytes());
    response.getOutputStream().flush();
}

说明

自上而下工作:

我将返回类型更改为void,因为我不再需要返回视图。数据将在响应对象的正文中找到。

我的应用程序配置为支持 format 参数在 XML 和 JSON 之间切换,但不幸的是,使用此特定解决方案,该参数无法自动传递给外部 Web 应用程序。所以我不得不自己重写格式参数并给它一个默认值。

接下来,我定义了一个稍后设置的应用程序类型。这不是绝对必要的,但对使用内容的客户很有帮助。

然后我使用 RestTemplate 将外部应用程序中的数据读入字符串。如果你试图返回一个视图,这样做是行不通的。您只需将 XML 或 JSON 作为字符串返回,其中会有多个转义字符。但是,如果您不担心视图,则可以毫无问题地执行此操作。

然后我开始在响应上设置内容类型和长度,然后将数据写入响应。之后我刷新流。此时,从客户端可以查看和使用数据。

感谢所有看过我问题的人!

【讨论】:

    【解决方案2】:

    如果我正确理解了您想要什么(我仍然不确定),您可以使用控制器 A 中的 Apache 库 HttpComponents http://hc.apache.org/(更准确地说是来自该库的 HttpClient)连接到 webapp B( url对应于控制器B),然后取它返回的JSON,然后简单地从控制器A返回这个JSON。

    一些关于如何使用 HttpClient 的示例: http://www.mkyong.com/java/apache-httpclient-examples/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2018-10-04
      • 1970-01-01
      相关资源
      最近更新 更多