我正在使用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。