diff --git a/jaxrs/paramconverter/README.adoc b/jaxrs/paramconverter/README.adoc new file mode 100644 index 000000000..767aa3c76 --- /dev/null +++ b/jaxrs/paramconverter/README.adoc @@ -0,0 +1,7 @@ += JAX-RS ParamConverter and ParamConverterProvider + +This example demonstrate the use of a +ParamConverter+ / +ParamConverterProvider+ to set the request parameters in a user bean +that has no constructor with a single +String+ argument, nor +fromValue(String)+ or +valueOf(String)+ methods. +The +ParamConverter+ is registered by a +ParamConverterProvider+ annotated with +@Provider+. + +The +ParamConverter+ applies to JAX-RS Resource Method parameters annotated with +@MatrixParam+, +@QueryParam+, +@PathParam+, +@CookieParam+ and +@HeaderParam+. \ No newline at end of file diff --git a/jaxrs/paramconverter/pom.xml b/jaxrs/paramconverter/pom.xml new file mode 100644 index 000000000..815858725 --- /dev/null +++ b/jaxrs/paramconverter/pom.xml @@ -0,0 +1,15 @@ + + 4.0.0 + + org.javaee7.jaxrs + jaxrs-samples + 1.0-SNAPSHOT + ../pom.xml + + + org.javaee7.jaxrs + paramconverter + 1.0-SNAPSHOT + war + diff --git a/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyApplication.java b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyApplication.java new file mode 100644 index 000000000..6bc998305 --- /dev/null +++ b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyApplication.java @@ -0,0 +1,12 @@ +package org.javaee7.jaxrs.paramconverter; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +/** + * @author Arun Gupta + */ +@ApplicationPath("webresources") +public class MyApplication extends Application { + +} diff --git a/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBean.java b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBean.java new file mode 100644 index 000000000..f8928c706 --- /dev/null +++ b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBean.java @@ -0,0 +1,30 @@ +package org.javaee7.jaxrs.paramconverter; + +/** + * @author Xavier Coulon + * + */ +public class MyBean { + + private String value; + + /** + * @return the value + */ + public String getValue() { + return value; + } + + /** + * @param value the value to set + */ + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return getValue(); + } + +} diff --git a/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBeanConverterProvider.java b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBeanConverterProvider.java new file mode 100644 index 000000000..82e213b96 --- /dev/null +++ b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBeanConverterProvider.java @@ -0,0 +1,40 @@ +package org.javaee7.jaxrs.paramconverter; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +import javax.ws.rs.ext.ParamConverter; +import javax.ws.rs.ext.ParamConverterProvider; +import javax.ws.rs.ext.Provider; + +/** + * @author Xavier Coulon + */ +@Provider +public class MyBeanConverterProvider implements ParamConverterProvider { + + @Override + public ParamConverter getConverter(Class clazz, Type type, Annotation[] annotations) { + if (clazz.getName().equals(MyBean.class.getName())) { + + return new ParamConverter() { + + @SuppressWarnings("unchecked") + @Override + public T fromString(String value) { + MyBean bean = new MyBean(); + bean.setValue(value); + return (T) bean; + } + + @Override + public String toString(T bean) { + return ((MyBean)bean).getValue(); + } + + }; + } + return null; + } + +} diff --git a/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyConverterProvider.java b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyConverterProvider.java new file mode 100644 index 000000000..7843a0a58 --- /dev/null +++ b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyConverterProvider.java @@ -0,0 +1,42 @@ +package org.javaee7.jaxrs.paramconverter; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +import javax.ws.rs.ext.ParamConverter; +import javax.ws.rs.ext.ParamConverterProvider; +import javax.ws.rs.ext.Provider; + +/** + * @author Xavier Coulon + * + */ +@Provider +public class MyConverterProvider implements ParamConverterProvider { + + @Override + public ParamConverter getConverter(final Class rawType, final Type genericType, + final Annotation[] annotations) { + if (rawType.getName().equals(MyBean.class.getName())) { + return new ParamConverter() { + + @Override + public T fromString(String value) { + MyBean myBean = new MyBean(); + myBean.setValue(value); + return rawType.cast(myBean); + } + + @Override + public String toString(T myBean) { + if (myBean == null) { + return null; + } + return myBean.toString(); + } + }; + } + return null; + } + +} diff --git a/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyResource.java b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyResource.java new file mode 100644 index 000000000..cdb26dd6d --- /dev/null +++ b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyResource.java @@ -0,0 +1,30 @@ +package org.javaee7.jaxrs.paramconverter; + +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +/** + * @author Arun Gupta + * @author Xavier coulon + */ +@Path("/endpoint") +public class MyResource { + + @GET + @Produces(MediaType.TEXT_PLAIN) + public String getWithQuery(@DefaultValue("bar") @QueryParam("search") MyBean myBean) { + return myBean.getValue(); + } + + @GET + @Path("/{id}") + @Produces(MediaType.TEXT_PLAIN) + public String getByPath(@PathParam("id") MyBean myBean) { + return myBean.getValue(); + } +} diff --git a/jaxrs/paramconverter/src/test/java/org/javaee7/jaxrs/paramconverter/MyResourceTest.java b/jaxrs/paramconverter/src/test/java/org/javaee7/jaxrs/paramconverter/MyResourceTest.java new file mode 100644 index 000000000..9c5bf56b0 --- /dev/null +++ b/jaxrs/paramconverter/src/test/java/org/javaee7/jaxrs/paramconverter/MyResourceTest.java @@ -0,0 +1,63 @@ +package org.javaee7.jaxrs.paramconverter; + +import static org.junit.Assert.assertEquals; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.WebTarget; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * @author Arun Gupta + * @author Xavier Coulon + */ +@RunWith(Arquillian.class) +public class MyResourceTest { + + @Deployment(testable = false) + public static WebArchive createDeployment() { + return ShrinkWrap.create(WebArchive.class) + .addClasses(MyApplication.class, MyResource.class, MyBeanConverterProvider.class, MyBean.class); + } + private static WebTarget target; + + @ArquillianResource + private URL base; + + @Before + public void setUpClass() throws MalformedURLException { + Client client = ClientBuilder.newClient(); + target = client.target(URI.create(new URL(base, "webresources/endpoint").toExternalForm())); + } + + @Test + public void testRequestWithQueryParam() { + String r = target.queryParam("search", "foo").request().get(String.class); + assertEquals("foo", r); + } + + @Test + public void testRequestWithNoQueryParam() { + String r = target.request().get(String.class); + assertEquals("bar", r); + } + + @Test + public void testRequestWithPathParam() { + String r = target.path("/foo").request().get(String.class); + assertEquals("foo", r); + } + +} diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml index 90e7e5acc..738af323f 100644 --- a/jaxrs/pom.xml +++ b/jaxrs/pom.xml @@ -32,6 +32,7 @@ link mapping-exceptions + paramconverter readerwriter readerwriter-json request-binding