如何创建同一个spring控制器的两个实例,每个实例具有不同的基础@requestMapping

时间:2010-06-28 16:27:39

标签: spring spring-mvc

我有一个弹簧控制器(MyController),它将数据作为json进行处理。

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

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

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

这可能吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

查看此example

答案 1 :(得分:1)

我不确定你是否要求这个,但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
    }
}