Spring MVC,提供RESTFul请求(json)和JSP(内容协商)

时间:2017-01-16 09:49:55

标签: rest spring-mvc content-negotiation

我正在尝试创建一个Spring MVC 4 Web项目(Maven项目)以处理REST请求。 如果HTTP接受是text / html,系统应该回答网页 在json中,如果是application / json(可能是其他格式,如XML,以防它是application / xml)。

我已经设置了一个控制器和JSP(我也使用了@RestController)。问题在于我无法使其发挥作用。如果系统使用JSP正确回答,那么json服务不起作用,反之亦然。 我是否必须为每个表示设置一个处理程序,以及如何?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

要确定用户请求的格式依赖于 ContentNegotationStrategy ,可以使用开箱即用的默认实现,但如果您愿意,也可以实现自己的

使用 HTTP消息转换器

配置和使用与Spring的内容协商

您必须在Spring MVC中启用内容协商:

<bean id="cnManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="true"/>
    <property name="ignoreAcceptHeader" value="true" />
    <property name="defaultContentType" value="application/json" />
    <property name="useJaf" value="false"/>

    <property name="mediaTypes">
        <map>
            <entry key="html" value="text/html" />
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
        </map>
    </property>
</bean>

或者使用java配置:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {


  @Override
 public void configureContentNegotiation(
            ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(true).
            ignoreAcceptHeader(true).
            useJaf(false).
            defaultContentType(MediaType.TEXT_HTML).
            mediaType("html", MediaType.TEXT_HTML).
            mediaType("xml", MediaType.APPLICATION_XML).
            mediaType("json", MediaType.APPLICATION_JSON);
    }
}

答案 1 :(得分:0)

这是一个例子: 第一个方法将返回每个get for url end ... / client的client.jsp页面,第二个方法将为每个get end返回一个客户端json对象... / clients / id

@RequestMapping(value = "/client", method = RequestMethod.GET)
public ModelAndView getClientPage(final HttpServletRequest request,
        final Model model,final HttpSession session) {
      // traitement 

    return new ModelAndView("client");
}

@RequestMapping(value = "/clients/{id}", method = RequestMethod.GET)
public @ResponseBody Client getClient(@pathVariable("id") long id) {

    Client client =  YourService.getClient(id);

    return client;
}

Contentnegotiatingviewresolver java config:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.yourbasepackage")
public class AppConfig extends WebMvcConfigurerAdapter {


    @Bean
    public ViewResolver jspViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

}