不需要json文件扩展名的Spring、JPA和Hibernate-RESTFul端点



我正在使用Spring 3和Hibernate 5创建一个简单的web服务。

我的专业依赖是:

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.2.14.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>3.2.14.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.1.Final</version>
        </dependency>

这不是我的完整依赖项列表,但它对我使用的版本有一个很好的了解。

此web服务的基本要求是提供一个端点,用户可以通过该端点基于唯一ID请求一些数据。数据必须以JSON形式返回。正在从SQL Server 2008数据库视图中检索数据。

我已经成功地将web服务配置为使用Hibernate和JPA来获得正确的数据,其中ID在视图中的一行上匹配。ID作为URL的参数提供,例如:

http://some/resource/location.json?id=1234

现在,正如我所说,这很好,如果ID匹配,就会获取数据,并将整理为json的POJO返回给用户。

我的问题是要求在URL中包含".json"文件扩展名。理想情况下,我希望URL看起来像这样:

http://some/resource/location?id=1234

注意没有".json"

我使用的视图解析器配置如下,只需忽略xml内容,因为我需要它:

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1"/>
        <property name="contentNegotiationManager">
            <bean class="org.springframework.web.accept.ContentNegotiationManager">
                <constructor-arg>
                    <bean class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">
                        <constructor-arg>
                            <map>
                                <entry key="json" value="application/json"/>
                                <entry key="xml" value="application/xml"/>
                            </map>
                        </constructor-arg>
                    </bean>
                </constructor-arg>
            </bean>
        </property>
        <property name="defaultViews">
            <list>
                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <constructor-arg>
                        <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                            <property name="autodetectAnnotations" value="true"/>
                        </bean>
                    </constructor-arg>
                </bean>
            </list>
        </property>
    </bean>

有没有一个不同的视图解析器我应该实现?

如果需要的话,我可以提供更多的细节,只需询问,谢谢你在这方面的帮助。

查看这个spring.io教程。它将适合您的需求,尤其是这个xml配置,因为我看到您使用的是xml配置,而不是java-config:

 <!-- Total customization - see below for explanation. -->
  <bean id="contentNegotiationManager"
             class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="true" />
    <property name="favorParameter" value="false" />
    <property name="parameterName" value="mediaType" />
    <property name="ignoreAcceptHeader" value="true"/>
    <property name="useJaf" value="false"/>
    <property name="defaultContentType" value="application/json" />
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
       </map>
    </property>
</bean>

我想我会根据你的需要定制它。

Nikolay为我指明了正确的方向,但实际的答案只是该教程中的一小部分,我认为它会对其他寻找类似答案的人更有帮助,以显示我最终使用了什么解决方案。

基本上,关键是将produces = {"application/json"}参数添加到我的控制器方法中,我将其映射到URLl,如下所示:

    @RequestMapping(
            value = "/some/resource/location",
            method = RequestMethod.GET,
            produces = {"application/json"}
    )
    public @ResponseBody CustomClass getSomething(@RequestParam String id) {
        return customService.getSomethingById(id);
    }

另外,我必须非常具体地使用servlet URL映射,从扩展映射转向特定URI映射。我确信这可以用不同的方式完成,但它符合我的特定要求:

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/servlet-config.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/some/resource/location</url-pattern>
</servlet-mapping>

我应该注意到,我从另一个堆栈溢出答案中得到了一些关于servlet url模式配置的帮助,该答案讨论了url模式除了哪些值。

就这样,它只是起了作用,毕竟不需要包括一个特殊的内容谈判豆。

我只是使用这样的终点:

http://some/resource/location?id=1234

它返回json。

最新更新