JSON-Mapping in meinem Spring MVC 3.2-Anwendung Funktioniert Nur für Eine Meiner Methoden
Arbeite ich an einem Spring 3.2 MVC-Anwendung. Es ist das setup Recht gewöhnlich, aber mein problem ist, dass ich immer ein 406 status Fehler, wenn ich versuchen, wieder ein JSON-Objekt von meiner controller-Methoden.
Der frustrierende Teil ist, dass ich die Antwort von dem server von allen, aber eine meiner Methoden. Den code habe ich im Lieferumfang enthalten ist eine modifizierte Spring MVC, json-Beispiel fand ich auf der web. Die Probe für die controller-Methode mit der path-variable funktioniert wie erwartet, aber die zusätzlichen Methoden, die ich Hinzugefügt, um den controller nicht.
Die einzige andere änderung, die ich gemacht, um den Beispiel-code tritt in der pom. Ich habe ein Upgrade der jackson-Abhängigkeit auf die neueste version.
So was bin ich? Ich habe die jackson-mapper-Gläser auf meinem classpath. Ich bin mit der <mvc:annotation-driven />
Richtlinie in meinem servlet und ich bin mit der @ResponseBody
annotation mit jedem meiner controller-Methoden.
Jede Hilfe wäre sehr geschätzt werden!
Dispatcher-servlet:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="uk.co.jeeni" />
<mvc:annotation-driven />
</beans>
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>uk.co.jeeni</groupId>
<artifactId>spring-json</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<name>Spring 3 MVC JSON Example</name>
<properties>
<spring.version>3.2.1.RELEASE</spring.version>
</properties>
<dependencies>
<!--
Jackson mapper is used by spring to convert
Java POJOs to JSON strings.
-->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.12</version>
</dependency>
<!-- START: Spring web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- END: Spring web -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
</plugin>
</plugins>
<finalName>spring-mvc-json</finalName>
</build>
Controller:
package uk.co.jeeni;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class JsonService {
private static Map<String, Person> data = new HashMap<String, Person>();
static{
data.put("ADAM", new Person("Adam", "Davies", 42));
data.put("JANE", new Person("Jane", "Harrison", 35));
}
@RequestMapping(value="{name}", method = RequestMethod.GET)
public @ResponseBody Person getPerson(@PathVariable String name){
Person p = new Person(name, name, 105);//data.get(name.toUpperCase());
return p;
}
@RequestMapping(value="/testJson.html", method=RequestMethod.GET)
public @ResponseBody List<Person> testJson()
{
List<Person> people = new ArrayList<Person>();
for(int i=0;i<10;i++)
{
Person p = new Person("Firstname", "Lastname", i);
people.add(p);
}
return people;
}
@ResponseBody
@RequestMapping(value="testJsonPojo.html", method=RequestMethod.GET)
public Person testJsonPojo()
{
Person individual = new Person("Firstname", "Lastname", 105);
return individual;
}
}
Person.java:
package uk.co.jeeni;
public class Person {
private String firstName;
private String lastName;
private int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- Die eine nicht funktioniert? Auch, was-client verwenden Sie? Ein browser, ajax?
- mein client ist firefox wenn ich es getestet habe mit ajax auch. Die Methode mit der path-variable funktioniert. Die anderen nicht.
- Versuchen Sie es mit einem java-client (mit
URLConnection
oder eineHttPClient
), um eine Anforderung an die Anwendung, aber die Accept-header aufapplication/json
. HTTP 406 Fehler tritt auf, weil der inakzeptabel Inhalt - ok...kann ich versuchen, aber es wird nicht erklärt, warum einer meiner Methoden funktioniert, wie ich erwarte, dass es, während die andere nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem zugeordneten URL ' s für die Methoden, die nicht arbeiten, Ende mit .html-Code. Das macht keinen Sinn, da sind Sie wieder, JSON-Daten. Ich schlage vor, Sie ändern Sie die Zuordnung wie:
Wegen der Verlängerung, der Frühling legt den Antrag den media-Typ auf html, so dass es nicht an einem JSON view.
ContentNegotiatingViewResolver
. Kratzer, der Letzte Kommentar.Könnte es ein problem mit dem mvc:Anmerkungen eingeführt, in 3.2 die wurde hier beantwortet:
https://stackoverflow.com/a/13939290/3014094
Gibt es eine weitere Veränderung zu mvc:Anmerkungen erforderlich, die im Frühjahr 3.2. Es versucht, automatisch eine Zuordnung der Medien-Typ basierend auf der Erweiterung der Anfrage. Ich denke, dass es wahrscheinlich zu sein /doSomething.html das ist nicht die Zuordnung zu JSON.
Aktualisieren Sie Ihre spring mvc config, um diese auto-mapping deaktiviert