【问题标题】:How to create two instances of the same spring controller, each with a different base @requestMapping如何创建同一个弹簧控制器的两个实例,每个实例都有不同的基础@requestMapping
【发布时间】:2010-06-28 16:27:38
【问题描述】:

我有一个弹簧控制器 (MyController),它以 json 格式提供数据。

通过一些配置更改,我将能够重用相同的控制器并让它提供相同的数据,但作为 xml,而不是 json。

我希望能够创建 myControllerInstanceA,并将其配置为使用 /json 作为基本 url,然后创建 myControllerInstanceB 并让它使用 /xml 作为基本 url。

我能想到的唯一方法是将 MyController 子类化,并将子类的 @requestMapping 设置为 /xml。我宁愿能够在我的 springap-servlet.xml 中进行一些配置以达到相同的效果。

这可能吗?

我猜你们中的一些春季巫师阅读本文可能会想“他为什么要这样做”。所以我将解释我正在使用的技术:我正在创建一个控制器,它将简单的 java bean 添加到 ModelAndView。控制器还广告一个视图。该视图采用 java bean 并将它们序列化为 json 或 xml,具体取决于控制器的配置方式。我认为可能有一种更类似于 Spring 的方法来做到这一点,但这种方法似乎很简单直接。此外,它允许我使用我熟悉的 JSON 库,而不是 Spring 似乎设置使用的那个。任何告诉我 Spring 方法的人都可以得分 - 如何轻松地提供与 json 或 xml 相同的数据,尽可能重用控制器代码。

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

    使用ContentNegotiatingViewResolver 解决视图。此解析将使用不同的配置视图根据请求的 Accepts Header 或扩展来呈现模型。默认情况下,它使用 MappingJacksonJsonView for JSON,您必须配置一个 Xml Marshaller 以与 MarshallingView 一起使用。

    通过此配置,您可以让每个带注释的方法支持无限数据格式。

    看看这个example

    【讨论】:

      【解决方案2】:

      我不确定您是否要求这样做,但 Spring 3 有 ContentNegotiationResolver 可以帮助返回 json 或 xml:

      <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
          <property name="mediaTypes">
              <map>
                  <entry key="xml" value="application/xml"/>
                  <entry key="json" value="application/json"/>
              </map>  
          </property>
      </bean>
      

      并且在控制器中你可以将 json 和 xml 映射到同一个控制器方法。

      @Controller
      class MyClass(){
          @RequestMapping(value={"/yourURL.json", "/yourURL.xml"})
          public Object yourController(){
              return Object
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        • 1970-01-01
        • 2012-12-14
        • 1970-01-01
        • 2017-07-09
        相关资源
        最近更新 更多