我用webservices示例创建了一个简单的Spring,但是当我尝试获取响应时,我收到错误:
HTTP状态406 -
此请求标识的资源只能生成 根据请求具有不可接受的特征的回复 “接受”标题。
这是我的Spring控制器:
@Controller
public class DataController {
@RequestMapping("studentlist")
public @ResponseBody
List<Student> getStudentList() {
List<Student> studentList = new ArrayList<Student>();
studentList.add(new Student(2, "A1", "B1", "a@gmail.com", "123456"));
studentList.add(new Student(3, "A2", "B2", "b@gmail.com", "123456"));
studentList.add(new Student(4, "A3", "B3", "c@gmail.com", "123456"));
return studentList;
}
}
这是我的Student.java
文件:
@XmlRootElement
public class Student {
int id;
String firstName;
String lastName;
String email;
String mobileNumber;
// Setters & Getters
}
My Spring Web配置文件位于以下条目之下:
<context:component-scan base-package="com.web.controller" />
<mvc:annotation-driven />
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="text/xml" />
<entry key="htm" value="text/html" />
</map>
</property>
<property name="defaultContentType" value="text/html" />
<property name="defaultViews">
<list>
<!-- JSON View -->
<bean
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
</bean>
<!-- JAXB XML View -->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.web.domain.Student</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
</bean>
根据这些设置,我了解如果我的网址以.json
结尾,我会收到JSON回复。如果它以.xml
结尾,我将获得XML响应。同样,如果网址以.htm
结尾,我会得到一个HTML回复。
如果我将网址设为http://localhost:8080/spring-ws/studentlist.json
,那么我就会成功获得JSON响应。
现在,如果我的网址为http://localhost:8080/spring-ws/studentlist.xml
或http://localhost:8080/spring-ws/studentlist.htm
,那么我收到以下错误消息:
此请求标识的资源只能生成 根据请求具有不可接受的特征的回复 “接受”标题。
你可以帮我解决这个问题吗?
在我的代码中,ignoreAcceptHeader
属性的用途是什么?这是否一直需要?
我已经提到了这篇SO帖子:Spring RESTful Web Service with JSON gives HTTP 406 error code
正如上面的帖子所述,我已经尝试将Accept
标题设置为application/xml
和text/html
,同时使用Chrome PostMan客户端提交请求,但我仍然看到同样的问题。< / p>
答案 0 :(得分:1)
您正在尝试在控制器中返回List
个Student
个对象。
因此,使用JAXB注释创建一个包装类,并在从控制器返回时使用该包装类来解决问题。
例如,创建如下的类:
@XmlRootElement
public class WrapperList<T> {
private List<T> list;
public WrapperList() {
list = new ArrayList<T>();
}
public WrapperList(List<T> list) {
this.list = list;
}
@XmlAnyElement
public List<T> getItems() {
return list;
}
}
并在课堂上返回:
@RequestMapping("studentlist")
public
WrapperList<Student> getStudentList() {
List<Student> studentList = new ArrayList<Student>();
// add students to the list and put them in wrapper class
WrapperList<Student> list = new WrapperList<Student>(studentList);
return list;
}
此外,您可以保持您的配置简单:
<beans>
<context:component-scan base-package="com.web.controller" />
<mvc:annotation-driven />
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="text/xml" />
<entry key="htm" value="text/html" />
</map>
</property>
<property name="defaultContentType" value="text/html" />
<property name="ignoreAcceptHeader" value="true" />
</bean>
</beans>
答案 1 :(得分:0)
我认为example更符合您的要求。在控制器而不是@ResponseBody和实际的java对象作为返回类型,它们为控制器中的视图名称(&#34; pizza&#34;)返回一个String。