Jax-rs & json

SananniC

Grünschnabel
Moin Moin,

Ich bin seit Tagen schier am verzweifeln, habe einen REST server hier der ums verrecken kein JSON verschicken will. Trotz pojo Mapping und der Jersey json Library.

So sieht momentan die Web.xml aus:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>ServletAdaptor</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
	<init-param>
		<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
		<param-value>true</param-value>
	</init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletAdaptor</servlet-name>
        <url-pattern>/resources/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

und so schaut der code aus:
Code:
@Path("user")
public class UserResource {

	
	private static User user = new User();
	
	/*
	 * Get  
	 * Returns  XML/JSON/if header is configurated for ReturnType
	 */
	@GET
	@Produces({MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON})
	public User getUser() {
            
		
		return user;
		
	}

Kann mir irgendjemand weiterhelfen auf was ich noch achten muss?
Fehlermeldung ist desübrigen:

A message body writer for Java class xyz.class and MIME media type application/json was not found
... 24 more

Vielen Dank im voraus!
 
Hallo,

hast du an deiner User Klasse die Annotation @XmlRootElement (javax.xml.bind.annotation.XmlRootElement) stehen?

Ich denke das fehlt dir... hier ein komplettes Beispiel mit Jersey 1.12 und Servlet 3.0 ohne web.xml:

User
Java:
package de.tutorials.app.um.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class User {

	private Long id;
	private String name;

	public User() {
	}

	public User(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}
}


Unsere UserResource:
Java:
package de.tutorials.app.um.remote;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import de.tutorials.app.um.model.User;


@Path("app")
public class UserResource {
	
	@GET
    @Produces({MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON})
	@Path("/user/{id}")
	public User getUser(@PathParam("id") Long id ){
		User user = new User("User"+System.currentTimeMillis());
		user.setId(id);
		return user;
	}
}

Unser Bootstrap:
(Damit diese Klasse beim Starten der Web-App geladen wird, muss in der Datei
META-INF/services/javax.servlet.ServletContainerInitializer
der Name der Klasse abgelegt werden: de.tutorials.app.web.boot.Bootstrap)
Java:
package de.tutorials.app.web.boot;

import java.util.Set;

import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;

import com.sun.jersey.spi.container.servlet.ServletContainer;

public class Bootstrap implements ServletContainerInitializer {

	public void onStartup(Set<Class<?>> arg0, ServletContext sc) throws ServletException {

		configureJaxRsProvider(sc);

	}

	private void configureJaxRsProvider(ServletContext sc) {
		Dynamic servletAdaptorConfig = sc.addServlet("ServletAdaptor",ServletContainer.class);
		servletAdaptorConfig.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true");
		servletAdaptorConfig.setLoadOnStartup(1);
		servletAdaptorConfig.addMapping("/resources/*");
	}
}

Anschließend kann man Beispielsweise über:
Code:
http://localhost:8080/de.tutorials.web.training/resources/app/user/123

folgende Ausgabe bekommen:
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user><id>123</id><name>User1337013749900</name></user>

Um die JSON Ausgabe kann man dann Beispielsweise mit CURL auf der Konsole testen:
Code:
curl -i -H "Accept: application/json" http://localhost:8080/de.tutorials.web.training/resources/app/user/123

Ausgabe: (JSON)
Javascript:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json
Transfer-Encoding: chunked
Date: Mon, 14 May 2012 16:53:18 GMT

{"id":123,"name":"User1337014398217"}

Hier noch das maven pom.xml:
XML:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>de.tutorials.web.training</groupId>
	<artifactId>de.tutorials.web.training</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<properties>
		<jersey.version>1.12</jersey.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-json</artifactId>
			<version>${jersey.version}</version>
		</dependency>
	
		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-servlet</artifactId>
			<version>${jersey.version}</version>
		</dependency>

		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-server</artifactId>
			<version>${jersey.version}</version>
		</dependency>
	</dependencies>

</project>

Gruß Tom
 
Zuletzt bearbeitet von einem Moderator:
Hi Tom!
Vielen, vielen Dank! Das Tutorial hatte ich gar nicht gefunden.
Jedoch war mein Problem etwas simpler: Es hatten lediglich die richtigen(!) Librarys gefehlt um die JSON Unterstützung von Jersey zu nutzen.
Falls jemand ähnliche Probleme hat: Achtet darauf um das pojomapping zu nutzen benötigt ihr auch die Jackson Librarys!

Nundenn, nach einem 12 Stunden rätselsuche Arbeitstag reicht es jetzt für heute auch!

(Und nochmals Danke für die ellenlange Antwort!)


Grüße Sti
 
Zurück