gpt4 book ai didi

java - 在 Spring MVC 中处理多种内容类型......首选哪种方法?

转载 作者:行者123 更新时间:2023-11-30 09:52:01 24 4
gpt4 key购买 nike

因此,在我们的 Spring 应用程序中,我们已经到了需要决定如何处理 View 和内容协商的地步。以前,我们的端点仅支持一种特定的内容类型。

我将介绍我认为的三种方法。

我的问题:哪一项通常被认为是最佳实践/最少的维护?我们的目标是在我们的应用程序中遵循一个可靠的约定,如果需要,可以在需要时打破它以提供灵 active 。

第一种方法:
使用 ContentNegotiatingViewResolver。这将涉及在 servlet 文件中定义的映射......在 Controller 中,每个 Controller 操作都需要使用一些魔术字符串在映射中显式设置对象。 Controller 操作将返回一个引用模板名称的字符串...类似于以下内容:

@RequestMapping(value = "/someMapping/source", method = RequestMethod.GET)
public String foo(Model model)
{
// more stuff here
model.addAttribute(SOME_MODEL_KEY, new ArrayList<String>() { "hello world"});

return "someDummyJsonString";
}

缺点:
View 解析器似乎有点笨拙……它们有优先级,您需要经常覆盖它们,等等。另外,我不喜欢用于引用模板/ View bean 名称的“魔术字符串”的想法。

第二种方法:
我认为这是 Spring 3.0 中的新功能,但在 RequestMapping 中,您可以匹配 header ...因此您可以像这样匹配 Accept header :

@RequestMapping(value="/someMapping", method = RequestMethod.GET, headers="Accept=application/json")
public @ResponseBody SomeBar foo()
{
// call common controller code here
return buildBar();
}

@RequestMapping(value="/someMapping", method = RequestMethod.GET, headers="Accept=text/xml")
public String foo(Model model)
{
model.addAttribute("someModelName", this.buildBar());
return "someTemplateNameProcessedByViewResolver";
}

SomeBar buildBar()
{
return new SomeBar();
}

缺点:
可能不够灵活?我不确定,但我认为我真的很喜欢 headers 方法...我见过其他框架(RESTLet、Rails)使用类似的方法。

第三种方法:
第三种方法涉及制作自定义 View,它将根据 Accept header 协商内容,并通过适当的方法抛出模型。这个内容协商 View 必须知道一个模板,并加载模板等:

@RequestMapping(value="/someMapping", method = RequestMethod.GET, headers="Accept=text/xml")
public View foo()
{
SomeBar bar = new SomeBar();
ContentNegotiatingView view = new ContentNegotiatingView(bar, "templateName");

return return view;
}

缺点:
在这种情况下, View 似乎做得太多了…… View 将查看 header ,并设置响应主体本身。它可能还需要设置 http 状态。

所以,对于文字墙感到抱歉,让我知道您对此的想法。谢谢

最佳答案

别人只是asked this .参见 my answer .

关于java - 在 Spring MVC 中处理多种内容类型......首选哪种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com