Problem with StringConverter in JAX-RS
gstvie Jul 30, 2013 11:47 AMHello,
I recently started working with JBoss again and I am struggling a bit.
At the moment, I am trying to build a JAX-RS service that is returns a simple data structure.
One of the fields however has to be passed to a StringConverter.
The REST - service returns the json - data, however the String conversion is never executed.
My environment ist jboss-eap-6.1. and I am using the jboss-javaee6-multi project structure. I attached the complete source to this post.
I would be really, really thankful, if someone could help me with this problem :-)
My domain - model consists of two classes: MyObjectContainer and MyObject. MyObject should use a StringConverter, when it is marshalled to JSON - this is the following code:
@Provider public class MyConverter implements StringConverter<MyObject>{ @Override public MyObject fromString(String arg0) { MyObject my = new MyObject(); my.setLastName((arg0.split(", "))[0]); my.setFirstName((arg0.split(", "))[1]); return my; } @Override public String toString(MyObject arg0) { return arg0.getLastName() + ", " + arg0.getFirstName(); } }
My Service looks like this and just returns some dummy information for testing:
@Path("/context") public class ContextResource { private final static String MEDIA_TYPE = "application/vnd.mtp.context.v1+json"; @GET @Produces(MEDIA_TYPE) public MyObjectContainer getContext() { MyObjectContainer mycont = new MyObjectContainer(); MyObject my = new MyObject(); mycont.setId(1L); my.setLastName("Doe"); my.setFirstName("John"); mycont.setMy(my); return mycont; } }
But somehow I always get this Json String:
{"my":{"firstName":"John","lastName":"Doe"},"id":1,"uri":"/mycontainer/1"}
instead of
{"my": "Doe, John","id":1,"uri":"/mycontainer/1"}
the two domain objects look like this:
@JsonSerialize(include = Inclusion.NON_EMPTY) public class MyObjectContainer implements Serializable{ public static final String URIPATTERN ="/mycontainer/{id}"; private MyObject my; public MyObject getMy() { return my; } ... } public class MyObject { private String firstName; private String lastName; 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; } }
I tried quite a few things with web.xml (i.e. resteasy.scan, resteasy.providers,...), however I think it should be enough to include an empty web.xml and use a JaxRsActivactor class instead (as in the ticketmonster-tutorial).
To be complete - the relevant part of my pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>jboss-javaee6-multi</artifactId> <groupId>org.jboss.tools.example</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>jboss-javaee6-multi-web</artifactId> <packaging>war</packaging> <name>jboss-javaee6-multi: WAR Module</name> <url>http://jboss.org/jbossas</url> <licenses> <license> <name>Apache License, Version 2.0</name> <distribution>repo</distribution> <url>http://www.apache.org/licenses/LICENSE-2.0.html</url> </license> </licenses> <dependencies> <!-- Dependency on the EJB module so we can use it's services if needed --> <dependency> <groupId>org.jboss.tools.example</groupId> <artifactId>jboss-javaee6-multi-ejb</artifactId> <type>ejb</type> <scope>provided</scope> </dependency> <!-- Import the JAX-RS API, we use provided scope as the API is included in JBoss AS 7 --> <dependency> <groupId>org.jboss.spec.javax.ws.rs</groupId> <artifactId>jboss-jaxrs-api_1.1_spec</artifactId> <scope>provided</scope> </dependency> <!-- Import the CDI API, we use provided scope as the API is included in JBoss AS 7 --> <dependency> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> <scope>provided</scope> </dependency> <!-- Import the JSF API, we use provided scope as the API is included in JBoss AS 7 --> <dependency> <groupId>org.jboss.spec.javax.faces</groupId> <artifactId>jboss-jsf-api_2.1_spec</artifactId> <scope>provided</scope> </dependency> <!-- Import the JPA API, we use provided scope as the API is included in JBoss AS 7 --> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <scope>provided</scope> </dependency> <!-- JSR-303 (Bean Validation) Implementation --> <!-- Provides portable constraints such as @Email --> <!-- Hibernate Validator is shipped in JBoss AS 7 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <scope>provided</scope> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>2.3.7.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jackson-provider</artifactId> <version>2.3.6.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-cdi</artifactId> <version>2.3.7.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-jaxrs</artifactId> <version>1.9.9</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.9</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.9</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>${version.war.plugin}</version> <configuration> <!-- Java EE 6 doesn't require web.xml, Maven needs to catch up! --> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> </project>
If somebody could point me in the right direction, I would be forever thankful ;-).
BR,
Gerald
-
jboss-javaee6-multi.zip 61.8 KB