Jersey Json und Pojo
Habe ich damit verbracht, viel zu viele Stunden (über 10 würde ich sagen) versucht, herauszufinden, wie man grundlegende json-Aufrufe (aus angularjs) zu öffnen und den Prozess auf meinem Trikot 2.4.
Ich habe versucht, jede mögliche Folge auf google und bin noch immer ein
415 (Unsupported Media Type)
client-Seite und eine
org.glassfish.jersey.Nachricht.intern.MessageBodyProviderNotFoundException: MessageBodyReader nicht gefunden für media-type=application/json, Typ=class-jersey.webreadability.Controller.jsonmodels.TextInput genericType=class jersey.webreadability.Controller.jsonmodels.TextInput.
auf der server-Seite.
Werde ich hier schreiben, jede mögliche Datei, die ich geändert habe, beim Versuch dieses Problem zu lösen, mit der Hoffnung es wird helfen, jemand, um mir zu helfen.
Im moment habe ich noch nicht wirklich, wie es funktioniert, solange es funktioniert, ich verstehe, dass wer ich sollte wohl dies funktioniert entweder Jackson oder Gson.
Abhängigkeiten (von der POM-Datei):
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json</artifactId>
<version>2.0-m05-1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.17.1</version>
</dependency>
aus der Web.xml:
<servlet>
<servlet-name>webReadability</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>jersey.webreadability.controllers</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.algo.server.webservice;org.codehaus.jackson.jaxrs</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
Objekt Klasse:
@XmlRootElement(name = "TextInput")
public class TextInput implements Serializable {
@XmlElement public String url;
@XmlElement public String text;
@XmlElement public String file;
public TextInput() {
}
public TextInput(String url, String text, String file) {
this.url = url;
this.text = text;
this.file = file;
}
@Override
public String toString() {
return "TextInput{" + "url=" + url + ", text=" + text + ", file=" + file +
'}';
}
}
main-Klasse:
@Path("/analysisController")
public class AnalysisController {
@POST
@Path("/sayHello")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public String sayHello(final TextInput text) {
System.out.println("printing out the sent text: " + text);
return "hello " + text.file;
}
}
und js:
var mockDataForThisTest = "json=" + encodeURI(JSON.stringify([
{
url: "http://www.example.com",
text: "txext text tex",
file: $scope.textarea
}
]));
var httpRequest = $http({
method: 'POST',
url: '/rest/analysisController/sayHello/',
data: mockDataForThisTest,
headers: {
'Content-Type': 'application/json'
}
}).success(function(data, status) {
$scope.textarea = data;
console.log(data);
}).error(function(error) {
console.log('error!');
});
Dass alles, was ich derzeit habe, ich hoffe es hilft.
Danke so sehr viel.
- Könnte man diesen Fehler, wenn der Content-Type nicht richtig eingestellt ist. Können Sie überprüfen, auf, die.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin das hinzufügen dieses als meine eigene Antwort, weil ich denke, das wird helfen, jemand mit einem schrecklichen Arbeitskopie von Jersey in die Zukunft. Zur gleichen Zeit, die Antwort von @Michal Gajdos war grealy hilfreich und Sie sollten auch die Beziehung zu seinem text, wenn Probleme in der Zukunft.
Was schließlich geholfen, mir wurde ein dependecy die enthält so ziemlich alles, was Sie brauchen. fügen Sie einfach es und geben Sie es ein versuchen
Quelle: Git
Abhängigkeiten
Entfernen Sie die beiden
jersey-media-json
(dieses Modul gibt es nicht mehr im Trikot 2.x) undjersey-json
(die ist nur für Jersey-1.x), und fügen Sie eines der Modulejersey-media-moxy
(JAXB) oderjersey-media-json-jackson
(POJO). Sehen JSON-Kapitel in Jersey-Benutzerhandbuch für mehr Informationen über diese Module.web.xml
Entfernen
com.sun.jersey.config.property.packages
undcom.sun.jersey.api.json.POJOMappingFeature
die Jersey 1.x-spezifisch und haben keinen Einsatz im Trikot 2.x. Das erste man wurde ersetzt durchjersey.config.server.provider.packages
und der zweite wurde entfernt (zur Verwendung POJO JSON<->Objekt-mapping verwenden Jackson Moduljersey-media-json-jackson
).Register-Funktionen
Wenn Sie
jersey-media-json-jackson
Modul müssen Sie sich registrieren JacksonFeature in eine Erweiterung der JAX-RS-Anwendung oder inweb.xml
(mit Eigenschaften von ServerProperties) - siehe Jackson Kapitel. MOXy (jersey-media-moxy
) wird automatisch registriert, wenn das Modul auf der class-path.return Response.ok(text).build();
) bekomme ich eineMessageBodyReader not found for media type=application/json
oder MessageBodyWriter hängt davon ab, ob ich senden oder empfangenAktivieren JacksonFeature innerhalb web.xml. Siehe auch ServerProperties