Spring Webservices提供406错误

时间:2015-06-19 20:36:59

标签: java spring web-services spring-mvc

我用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.xmlhttp://localhost:8080/spring-ws/studentlist.htm,那么我收到以下错误消息:

  

此请求标识的资源只能生成   根据请求具有不可接受的特征的回复   “接受”标题。

你可以帮我解决这个问题吗?

在我的代码中,ignoreAcceptHeader属性的用途是什么?这是否一直需要?

我已经提到了这篇SO帖子:Spring RESTful Web Service with JSON gives HTTP 406 error code

正如上面的帖子所述,我已经尝试将Accept标题设置为application/xmltext/html,同时使用Chrome PostMan客户端提交请求,但我仍然看到同样的问题。< / p>

2 个答案:

答案 0 :(得分:1)

您正在尝试在控制器中返回ListStudent个对象。

因此,使用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。