Skip to content

Commit 36ec58a

Browse files
committed
Merge pull request #224 from xcoulon/jaxrs-paramconverter
JAX-RS ParamConverterProvider sample project
2 parents 489a5ae + 0ec1981 commit 36ec58a

File tree

9 files changed

+240
-0
lines changed

9 files changed

+240
-0
lines changed

jaxrs/paramconverter/README.adoc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
= JAX-RS ParamConverter and ParamConverterProvider
2+
3+
This example demonstrate the use of a +ParamConverter+ / +ParamConverterProvider+ to set the request parameters in a user bean
4+
that has no constructor with a single +String+ argument, nor +fromValue(String)+ or +valueOf(String)+ methods.
5+
The +ParamConverter+ is registered by a +ParamConverterProvider+ annotated with +@Provider+.
6+
7+
The +ParamConverter+ applies to JAX-RS Resource Method parameters annotated with +@MatrixParam+, +@QueryParam+, +@PathParam+, +@CookieParam+ and +@HeaderParam+.

jaxrs/paramconverter/pom.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<parent>
5+
<groupId>org.javaee7.jaxrs</groupId>
6+
<artifactId>jaxrs-samples</artifactId>
7+
<version>1.0-SNAPSHOT</version>
8+
<relativePath>../pom.xml</relativePath>
9+
</parent>
10+
11+
<groupId>org.javaee7.jaxrs</groupId>
12+
<artifactId>paramconverter</artifactId>
13+
<version>1.0-SNAPSHOT</version>
14+
<packaging>war</packaging>
15+
</project>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.javaee7.jaxrs.paramconverter;
2+
3+
import javax.ws.rs.ApplicationPath;
4+
import javax.ws.rs.core.Application;
5+
6+
/**
7+
* @author Arun Gupta
8+
*/
9+
@ApplicationPath("webresources")
10+
public class MyApplication extends Application {
11+
12+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.javaee7.jaxrs.paramconverter;
2+
3+
/**
4+
* @author Xavier Coulon
5+
*
6+
*/
7+
public class MyBean {
8+
9+
private String value;
10+
11+
/**
12+
* @return the value
13+
*/
14+
public String getValue() {
15+
return value;
16+
}
17+
18+
/**
19+
* @param value the value to set
20+
*/
21+
public void setValue(String value) {
22+
this.value = value;
23+
}
24+
25+
@Override
26+
public String toString() {
27+
return getValue();
28+
}
29+
30+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.javaee7.jaxrs.paramconverter;
2+
3+
import java.lang.annotation.Annotation;
4+
import java.lang.reflect.Type;
5+
6+
import javax.ws.rs.ext.ParamConverter;
7+
import javax.ws.rs.ext.ParamConverterProvider;
8+
import javax.ws.rs.ext.Provider;
9+
10+
/**
11+
* @author Xavier Coulon
12+
*/
13+
@Provider
14+
public class MyBeanConverterProvider implements ParamConverterProvider {
15+
16+
@Override
17+
public <T> ParamConverter<T> getConverter(Class<T> clazz, Type type, Annotation[] annotations) {
18+
if (clazz.getName().equals(MyBean.class.getName())) {
19+
20+
return new ParamConverter<T>() {
21+
22+
@SuppressWarnings("unchecked")
23+
@Override
24+
public T fromString(String value) {
25+
MyBean bean = new MyBean();
26+
bean.setValue(value);
27+
return (T) bean;
28+
}
29+
30+
@Override
31+
public String toString(T bean) {
32+
return ((MyBean)bean).getValue();
33+
}
34+
35+
};
36+
}
37+
return null;
38+
}
39+
40+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.javaee7.jaxrs.paramconverter;
2+
3+
import java.lang.annotation.Annotation;
4+
import java.lang.reflect.Type;
5+
6+
import javax.ws.rs.ext.ParamConverter;
7+
import javax.ws.rs.ext.ParamConverterProvider;
8+
import javax.ws.rs.ext.Provider;
9+
10+
/**
11+
* @author Xavier Coulon
12+
*
13+
*/
14+
@Provider
15+
public class MyConverterProvider implements ParamConverterProvider {
16+
17+
@Override
18+
public <T> ParamConverter<T> getConverter(final Class<T> rawType, final Type genericType,
19+
final Annotation[] annotations) {
20+
if (rawType.getName().equals(MyBean.class.getName())) {
21+
return new ParamConverter<T>() {
22+
23+
@Override
24+
public T fromString(String value) {
25+
MyBean myBean = new MyBean();
26+
myBean.setValue(value);
27+
return rawType.cast(myBean);
28+
}
29+
30+
@Override
31+
public String toString(T myBean) {
32+
if (myBean == null) {
33+
return null;
34+
}
35+
return myBean.toString();
36+
}
37+
};
38+
}
39+
return null;
40+
}
41+
42+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.javaee7.jaxrs.paramconverter;
2+
3+
import javax.ws.rs.DefaultValue;
4+
import javax.ws.rs.GET;
5+
import javax.ws.rs.Path;
6+
import javax.ws.rs.PathParam;
7+
import javax.ws.rs.Produces;
8+
import javax.ws.rs.QueryParam;
9+
import javax.ws.rs.core.MediaType;
10+
11+
/**
12+
* @author Arun Gupta
13+
* @author Xavier coulon
14+
*/
15+
@Path("/endpoint")
16+
public class MyResource {
17+
18+
@GET
19+
@Produces(MediaType.TEXT_PLAIN)
20+
public String getWithQuery(@DefaultValue("bar") @QueryParam("search") MyBean myBean) {
21+
return myBean.getValue();
22+
}
23+
24+
@GET
25+
@Path("/{id}")
26+
@Produces(MediaType.TEXT_PLAIN)
27+
public String getByPath(@PathParam("id") MyBean myBean) {
28+
return myBean.getValue();
29+
}
30+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.javaee7.jaxrs.paramconverter;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.net.MalformedURLException;
6+
import java.net.URI;
7+
import java.net.URL;
8+
9+
import javax.ws.rs.client.Client;
10+
import javax.ws.rs.client.ClientBuilder;
11+
import javax.ws.rs.client.WebTarget;
12+
13+
import org.jboss.arquillian.container.test.api.Deployment;
14+
import org.jboss.arquillian.junit.Arquillian;
15+
import org.jboss.arquillian.test.api.ArquillianResource;
16+
import org.jboss.shrinkwrap.api.ShrinkWrap;
17+
import org.jboss.shrinkwrap.api.spec.WebArchive;
18+
import org.junit.Before;
19+
import org.junit.Test;
20+
import org.junit.runner.RunWith;
21+
22+
/**
23+
* @author Arun Gupta
24+
* @author Xavier Coulon
25+
*/
26+
@RunWith(Arquillian.class)
27+
public class MyResourceTest {
28+
29+
@Deployment(testable = false)
30+
public static WebArchive createDeployment() {
31+
return ShrinkWrap.create(WebArchive.class)
32+
.addClasses(MyApplication.class, MyResource.class, MyBeanConverterProvider.class, MyBean.class);
33+
}
34+
private static WebTarget target;
35+
36+
@ArquillianResource
37+
private URL base;
38+
39+
@Before
40+
public void setUpClass() throws MalformedURLException {
41+
Client client = ClientBuilder.newClient();
42+
target = client.target(URI.create(new URL(base, "webresources/endpoint").toExternalForm()));
43+
}
44+
45+
@Test
46+
public void testRequestWithQueryParam() {
47+
String r = target.queryParam("search", "foo").request().get(String.class);
48+
assertEquals("foo", r);
49+
}
50+
51+
@Test
52+
public void testRequestWithNoQueryParam() {
53+
String r = target.request().get(String.class);
54+
assertEquals("bar", r);
55+
}
56+
57+
@Test
58+
public void testRequestWithPathParam() {
59+
String r = target.path("/foo").request().get(String.class);
60+
assertEquals("foo", r);
61+
}
62+
63+
}

jaxrs/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<module>link</module>
3434
<module>mapping-exceptions</module>
3535
<!--<module>moxy</module>-->
36+
<module>paramconverter</module>
3637
<module>readerwriter</module>
3738
<module>readerwriter-json</module>
3839
<module>request-binding</module>

0 commit comments

Comments
 (0)