|
From: Michael B. <mic...@gm...> - 2008-10-24 16:17:49
|
Hi,
It would be nice to have some sort of custom parameter unmarshalling.
Currently parameter types can be String, primitive, or a class that
has a String constructor or static valueOf(String) method.
Some use cases:
- injecting interfaces
- injecting Enums (they already have a static valueOf(String) method)
- injecting thirdparty classes
- injecting factory created objects
example:
@GET
@Path("/book/{isbn}")
public String getBook(@PathParm(value = "isbn", provider =
ISBNFactory.class) ISBN id) {
...
}
@Provider
public class ISBNFactory {
@ProviderMethod
public ISBN create(String value) {
return new ISBNImpl(value);
}
}
The @ProviderMethod could be left out if there is only one matching method.
Or a new interface could be used, to be more in line with ExceptionMapper.
I realize the spec is final, but someday the will be a 1.1 or 2.0 :)
Any comments?
Michael Brackx
|
|
From: Bill B. <bb...@re...> - 2008-10-24 16:20:11
|
There's is HeaderDelegate in the specification. I could make sure that
is used for all String parameters.
Michael Brackx wrote:
> Hi,
>
> It would be nice to have some sort of custom parameter unmarshalling.
> Currently parameter types can be String, primitive, or a class that
> has a String constructor or static valueOf(String) method.
> Some use cases:
> - injecting interfaces
> - injecting Enums (they already have a static valueOf(String) method)
> - injecting thirdparty classes
> - injecting factory created objects
>
> example:
>
> @GET
> @Path("/book/{isbn}")
> public String getBook(@PathParm(value = "isbn", provider =
> ISBNFactory.class) ISBN id) {
> ...
> }
>
> @Provider
> public class ISBNFactory {
> @ProviderMethod
> public ISBN create(String value) {
> return new ISBNImpl(value);
> }
> }
>
> The @ProviderMethod could be left out if there is only one matching method.
> Or a new interface could be used, to be more in line with ExceptionMapper.
>
> I realize the spec is final, but someday the will be a 1.1 or 2.0 :)
> Any comments?
>
> Michael Brackx
>
> -------------------------------------------------------------------------
> This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
> Build the coolest Linux based applications with Moblin SDK & win great prizes
> Grand prize is a trip for two to an Open Source event anywhere in the world
> http://moblin-contest.org/redirect.php?banner_id=100&url=/
> _______________________________________________
> Resteasy-developers mailing list
> Res...@li...
> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
--
Bill Burke
JBoss, a division of Red Hat
http://bill.burkecentral.com
|
|
From: Michael B. <mic...@gm...> - 2008-10-24 16:31:54
|
That would be nice.
How could a HeaderDelegate be "activated" for a parameter?
Michael
On Fri, Oct 24, 2008 at 6:19 PM, Bill Burke <bb...@re...> wrote:
> There's is HeaderDelegate in the specification. I could make sure that is
> used for all String parameters.
>
> Michael Brackx wrote:
>>
>> Hi,
>>
>> It would be nice to have some sort of custom parameter unmarshalling.
>> Currently parameter types can be String, primitive, or a class that
>> has a String constructor or static valueOf(String) method.
>> Some use cases:
>> - injecting interfaces
>> - injecting Enums (they already have a static valueOf(String) method)
>> - injecting thirdparty classes
>> - injecting factory created objects
>>
>> example:
>>
>> @GET
>> @Path("/book/{isbn}")
>> public String getBook(@PathParm(value = "isbn", provider =
>> ISBNFactory.class) ISBN id) {
>> ...
>> }
>>
>> @Provider
>> public class ISBNFactory {
>> @ProviderMethod
>> public ISBN create(String value) {
>> return new ISBNImpl(value);
>> }
>> }
>>
>> The @ProviderMethod could be left out if there is only one matching
>> method.
>> Or a new interface could be used, to be more in line with ExceptionMapper.
>>
>> I realize the spec is final, but someday the will be a 1.1 or 2.0 :)
>> Any comments?
>>
>> Michael Brackx
>>
>> -------------------------------------------------------------------------
>> This SF.Net email is sponsored by the Moblin Your Move Developer's
>> challenge
>> Build the coolest Linux based applications with Moblin SDK & win great
>> prizes
>> Grand prize is a trip for two to an Open Source event anywhere in the
>> world
>> http://moblin-contest.org/redirect.php?banner_id=100&url=/
>> _______________________________________________
>> Resteasy-developers mailing list
>> Res...@li...
>> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
>
> --
> Bill Burke
> JBoss, a division of Red Hat
> http://bill.burkecentral.com
>
|
|
From: Bill B. <bb...@re...> - 2008-10-24 20:29:42
|
I don't want to overload HeaderDelegate.
I will create a new @Provider interface for this. Something like
public interface StringConverter<T>
{
T fromString(String val);
String toString(T val);
}
And then allow its use with @HeaderParam, @QueryParam, @PathParam,
@MatrixParam, and @FormParam injected objects.
Sound good?
Michael Brackx wrote:
> That would be nice.
> How could a HeaderDelegate be "activated" for a parameter?
>
> Michael
>
> On Fri, Oct 24, 2008 at 6:19 PM, Bill Burke <bb...@re...> wrote:
>> There's is HeaderDelegate in the specification. I could make sure that is
>> used for all String parameters.
>>
>> Michael Brackx wrote:
>>> Hi,
>>>
>>> It would be nice to have some sort of custom parameter unmarshalling.
>>> Currently parameter types can be String, primitive, or a class that
>>> has a String constructor or static valueOf(String) method.
>>> Some use cases:
>>> - injecting interfaces
>>> - injecting Enums (they already have a static valueOf(String) method)
>>> - injecting thirdparty classes
>>> - injecting factory created objects
>>>
>>> example:
>>>
>>> @GET
>>> @Path("/book/{isbn}")
>>> public String getBook(@PathParm(value = "isbn", provider =
>>> ISBNFactory.class) ISBN id) {
>>> ...
>>> }
>>>
>>> @Provider
>>> public class ISBNFactory {
>>> @ProviderMethod
>>> public ISBN create(String value) {
>>> return new ISBNImpl(value);
>>> }
>>> }
>>>
>>> The @ProviderMethod could be left out if there is only one matching
>>> method.
>>> Or a new interface could be used, to be more in line with ExceptionMapper.
>>>
>>> I realize the spec is final, but someday the will be a 1.1 or 2.0 :)
>>> Any comments?
>>>
>>> Michael Brackx
>>>
>>> -------------------------------------------------------------------------
>>> This SF.Net email is sponsored by the Moblin Your Move Developer's
>>> challenge
>>> Build the coolest Linux based applications with Moblin SDK & win great
>>> prizes
>>> Grand prize is a trip for two to an Open Source event anywhere in the
>>> world
>>> http://moblin-contest.org/redirect.php?banner_id=100&url=/
>>> _______________________________________________
>>> Resteasy-developers mailing list
>>> Res...@li...
>>> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
>> --
>> Bill Burke
>> JBoss, a division of Red Hat
>> http://bill.burkecentral.com
>>
--
Bill Burke
JBoss, a division of Red Hat
http://bill.burkecentral.com
|
|
From: Gennady S. <gsh...@gm...> - 2008-10-30 06:37:20
|
Hi,
I wonder whether it is possible to identify the @QueryParam existence
regardless of the parameter value.
I mean suppose I want to have service uri to be .../myService?doTest where
'doTest' is optional.
Annotating the method with @Param("doTest") will inject the parameter value
if parameter is passed or default if it is not, but is there a way to
differentiate between the cases?
Thanks,
Gennady
|
|
From: Bill B. <bb...@re...> - 2008-10-30 13:06:09
|
There's two ways to do this:
@PUT
public void put(@Context UriInfo uri)
{
boolean exists = uri.getQueryParameters().containsKey("doTest");
}
@PUT
public void put(@QueryParam("doTest") @DefaultValue("NOT EXISTS") String
doTest)
{
boolean exists = !"NOT EXISTS".equals(doTest);
}
Gennady Shumakher wrote:
> Hi,
>
> I wonder whether it is possible to identify the @QueryParam existence
> regardless of the parameter value.
> I mean suppose I want to have service uri to be .../myService?doTest where
> 'doTest' is optional.
> Annotating the method with @Param("doTest") will inject the parameter value
> if parameter is passed or default if it is not, but is there a way to
> differentiate between the cases?
>
> Thanks,
> Gennady
>
>
> -------------------------------------------------------------------------
> This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
> Build the coolest Linux based applications with Moblin SDK & win great prizes
> Grand prize is a trip for two to an Open Source event anywhere in the world
> http://moblin-contest.org/redirect.php?banner_id=100&url=/
> _______________________________________________
> Resteasy-developers mailing list
> Res...@li...
> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
--
Bill Burke
JBoss, a division of Red Hat
http://bill.burkecentral.com
|
|
From: Bill B. <bb...@re...> - 2008-10-29 21:09:18
|
Implemented in Trunk:
@PathParam, @QueryParam, @MatrixParam, @FormParam, and @HeaderParam are
represented as strings in a raw HTTP request. The specification says
that these types of injected parameters can be converted to objects if
these objects have a valueOf(String) static method or a constructor that
takes one String parameter. What if you have a class where valueOf() or
this string constructor doesn't exist or is inappropriate for an HTTP
request? Resteasy has a proprietary @Provider interface that you can
plug in:
package org.jboss.resteasy.spi;
public interface StringConverter<T>
{
T fromString(String str);
String toString(T value);
}
You implement this interface to provide your own custom string
marshalling. It is registered within your web.xml under the
resteasy.providers context-param (See Installation and Configuration
chapter). You can do it manually by calling the
ResteasyProviderFactory.addStringConverter() method. Here's a simple
example of using a StringConverter:
import org.jboss.resteasy.client.ProxyFactory;
import org.jboss.resteasy.spi.StringConverter;
import org.jboss.resteasy.test.BaseResourceTest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.ext.Provider;
public class StringConverterTest extends BaseResourceTest
{
public static class POJO
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
@Provider
public static class POJOConverter implements StringConverter<POJO>
{
public POJO fromString(String str)
{
System.out.println("FROM STRNG: " + str);
POJO pojo = new POJO();
pojo.setName(str);
return pojo;
}
public String toString(POJO value)
{
return value.getName();
}
}
@Path("/")
public static class MyResource
{
@Path("{pojo}")
@PUT
public void put(@QueryParam("pojo")POJO q,
@PathParam("pojo")POJO pp,
@MatrixParam("pojo")POJO mp,
@HeaderParam("pojo")POJO hp)
{
Assert.assertEquals(q.getName(), "pojo");
Assert.assertEquals(pp.getName(), "pojo");
Assert.assertEquals(mp.getName(), "pojo");
Assert.assertEquals(hp.getName(), "pojo");
}
}
@Before
public void setUp() throws Exception
{
dispatcher.getProviderFactory().addStringConverter(POJOConverter.class);
dispatcher.getRegistry().addPerRequestResource(MyResource.class);
}
@Path("/")
public static interface MyClient
{
@Path("{pojo}")
@PUT
void put(@QueryParam("pojo")POJO q, @PathParam("pojo")POJO pp,
@MatrixParam("pojo")POJO mp, @HeaderParam("pojo")POJO
hp);
}
@Test
public void testIt() throws Exception
{
MyClient client = ProxyFactory.create(MyClient.class,
"http://localhost:8081");
POJO pojo = new POJO();
pojo.setName("pojo");
client.put(pojo, pojo, pojo, pojo);
}
}
Bill Burke wrote:
> I don't want to overload HeaderDelegate.
>
> I will create a new @Provider interface for this. Something like
>
> public interface StringConverter<T>
> {
> T fromString(String val);
> String toString(T val);
> }
>
> And then allow its use with @HeaderParam, @QueryParam, @PathParam,
> @MatrixParam, and @FormParam injected objects.
>
> Sound good?
>
> Michael Brackx wrote:
>> That would be nice.
>> How could a HeaderDelegate be "activated" for a parameter?
>>
>> Michael
>>
>> On Fri, Oct 24, 2008 at 6:19 PM, Bill Burke <bb...@re...> wrote:
>>> There's is HeaderDelegate in the specification. I could make sure that is
>>> used for all String parameters.
>>>
>>> Michael Brackx wrote:
>>>> Hi,
>>>>
>>>> It would be nice to have some sort of custom parameter unmarshalling.
>>>> Currently parameter types can be String, primitive, or a class that
>>>> has a String constructor or static valueOf(String) method.
>>>> Some use cases:
>>>> - injecting interfaces
>>>> - injecting Enums (they already have a static valueOf(String) method)
>>>> - injecting thirdparty classes
>>>> - injecting factory created objects
>>>>
>>>> example:
>>>>
>>>> @GET
>>>> @Path("/book/{isbn}")
>>>> public String getBook(@PathParm(value = "isbn", provider =
>>>> ISBNFactory.class) ISBN id) {
>>>> ...
>>>> }
>>>>
>>>> @Provider
>>>> public class ISBNFactory {
>>>> @ProviderMethod
>>>> public ISBN create(String value) {
>>>> return new ISBNImpl(value);
>>>> }
>>>> }
>>>>
>>>> The @ProviderMethod could be left out if there is only one matching
>>>> method.
>>>> Or a new interface could be used, to be more in line with ExceptionMapper.
>>>>
>>>> I realize the spec is final, but someday the will be a 1.1 or 2.0 :)
>>>> Any comments?
>>>>
>>>> Michael Brackx
>>>>
>>>> -------------------------------------------------------------------------
>>>> This SF.Net email is sponsored by the Moblin Your Move Developer's
>>>> challenge
>>>> Build the coolest Linux based applications with Moblin SDK & win great
>>>> prizes
>>>> Grand prize is a trip for two to an Open Source event anywhere in the
>>>> world
>>>> http://moblin-contest.org/redirect.php?banner_id=100&url=/
>>>> _______________________________________________
>>>> Resteasy-developers mailing list
>>>> Res...@li...
>>>> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
>>> --
>>> Bill Burke
>>> JBoss, a division of Red Hat
>>> http://bill.burkecentral.com
>>>
>
--
Bill Burke
JBoss, a division of Red Hat
http://bill.burkecentral.com
|
|
From: Michael B. <mic...@gm...> - 2008-10-27 08:40:26
|
> I will create a new @Provider interface for this. Something like
>
> public interface StringConverter<T>
> {
> T fromString(String val);
> String toString(T val);
> }
>
> And then allow its use with @HeaderParam, @QueryParam, @PathParam,
> @MatrixParam, and @FormParam injected objects.
>
> Sound good?
yes, it does.
Should the interface not be split in 2 parts? I suppose the from will
be used at the server side and the to at the client side.
Michael Brackx
|
|
From: Bill B. <bb...@re...> - 2008-10-27 12:23:35
|
Yeah, client and server, although headers can be in response or request.
Michael Brackx wrote:
>> I will create a new @Provider interface for this. Something like
>>
>> public interface StringConverter<T>
>> {
>> T fromString(String val);
>> String toString(T val);
>> }
>>
>> And then allow its use with @HeaderParam, @QueryParam, @PathParam,
>> @MatrixParam, and @FormParam injected objects.
>>
>> Sound good?
> yes, it does.
>
> Should the interface not be split in 2 parts? I suppose the from will
> be used at the server side and the to at the client side.
>
> Michael Brackx
--
Bill Burke
JBoss, a division of Red Hat
http://bill.burkecentral.com
|
|
From: Solomon D. <sd...@gm...> - 2008-10-30 00:08:13
|
Is there anyway to get something like this to work with JAXB? Can a
"Providers" use JPA/Hibernate to convert an object from and to a URL?
-Solomon
On Wed, Oct 29, 2008 at 5:09 PM, Bill Burke <bb...@re...> wrote:
> Implemented in Trunk:
>
> @PathParam, @QueryParam, @MatrixParam, @FormParam, and @HeaderParam are
> represented as strings in a raw HTTP request. The specification says
> that these types of injected parameters can be converted to objects if
> these objects have a valueOf(String) static method or a constructor that
> takes one String parameter. What if you have a class where valueOf() or
> this string constructor doesn't exist or is inappropriate for an HTTP
> request? Resteasy has a proprietary @Provider interface that you can
> plug in:
>
> package org.jboss.resteasy.spi;
>
> public interface StringConverter<T>
> {
> T fromString(String str);
>
> String toString(T value);
> }
>
>
> You implement this interface to provide your own custom string
> marshalling. It is registered within your web.xml under the
> resteasy.providers context-param (See Installation and Configuration
> chapter). You can do it manually by calling the
> ResteasyProviderFactory.addStringConverter() method. Here's a simple
> example of using a StringConverter:
>
> import org.jboss.resteasy.client.ProxyFactory;
> import org.jboss.resteasy.spi.StringConverter;
> import org.jboss.resteasy.test.BaseResourceTest;
> import org.junit.Assert;
> import org.junit.Before;
> import org.junit.Test;
>
> import javax.ws.rs.HeaderParam;
> import javax.ws.rs.MatrixParam;
> import javax.ws.rs.PUT;
> import javax.ws.rs.Path;
> import javax.ws.rs.PathParam;
> import javax.ws.rs.QueryParam;
> import javax.ws.rs.ext.Provider;
>
> public class StringConverterTest extends BaseResourceTest
> {
> public static class POJO
> {
> private String name;
>
> public String getName()
> {
> return name;
> }
>
> public void setName(String name)
> {
> this.name = name;
> }
> }
>
> @Provider
> public static class POJOConverter implements StringConverter<POJO>
> {
> public POJO fromString(String str)
> {
> System.out.println("FROM STRNG: " + str);
> POJO pojo = new POJO();
> pojo.setName(str);
> return pojo;
> }
>
> public String toString(POJO value)
> {
> return value.getName();
> }
> }
>
> @Path("/")
> public static class MyResource
> {
> @Path("{pojo}")
> @PUT
> public void put(@QueryParam("pojo")POJO q,
> @PathParam("pojo")POJO pp,
> @MatrixParam("pojo")POJO mp,
> @HeaderParam("pojo")POJO hp)
> {
> Assert.assertEquals(q.getName(), "pojo");
> Assert.assertEquals(pp.getName(), "pojo");
> Assert.assertEquals(mp.getName(), "pojo");
> Assert.assertEquals(hp.getName(), "pojo");
> }
> }
>
> @Before
> public void setUp() throws Exception
> {
>
> dispatcher.getProviderFactory().addStringConverter(POJOConverter.class);
> dispatcher.getRegistry().addPerRequestResource(MyResource.class);
> }
>
> @Path("/")
> public static interface MyClient
> {
> @Path("{pojo}")
> @PUT
> void put(@QueryParam("pojo")POJO q, @PathParam("pojo")POJO pp,
> @MatrixParam("pojo")POJO mp, @HeaderParam("pojo")POJO
> hp);
> }
>
> @Test
> public void testIt() throws Exception
> {
> MyClient client = ProxyFactory.create(MyClient.class,
> "http://localhost:8081");
> POJO pojo = new POJO();
> pojo.setName("pojo");
> client.put(pojo, pojo, pojo, pojo);
> }
> }
>
>
>
> Bill Burke wrote:
> > I don't want to overload HeaderDelegate.
> >
> > I will create a new @Provider interface for this. Something like
> >
> > public interface StringConverter<T>
> > {
> > T fromString(String val);
> > String toString(T val);
> > }
> >
> > And then allow its use with @HeaderParam, @QueryParam, @PathParam,
> > @MatrixParam, and @FormParam injected objects.
> >
> > Sound good?
> >
> > Michael Brackx wrote:
> >> That would be nice.
> >> How could a HeaderDelegate be "activated" for a parameter?
> >>
> >> Michael
> >>
> >> On Fri, Oct 24, 2008 at 6:19 PM, Bill Burke <bb...@re...> wrote:
> >>> There's is HeaderDelegate in the specification. I could make sure that
> is
> >>> used for all String parameters.
> >>>
> >>> Michael Brackx wrote:
> >>>> Hi,
> >>>>
> >>>> It would be nice to have some sort of custom parameter unmarshalling.
> >>>> Currently parameter types can be String, primitive, or a class that
> >>>> has a String constructor or static valueOf(String) method.
> >>>> Some use cases:
> >>>> - injecting interfaces
> >>>> - injecting Enums (they already have a static valueOf(String) method)
> >>>> - injecting thirdparty classes
> >>>> - injecting factory created objects
> >>>>
> >>>> example:
> >>>>
> >>>> @GET
> >>>> @Path("/book/{isbn}")
> >>>> public String getBook(@PathParm(value = "isbn", provider =
> >>>> ISBNFactory.class) ISBN id) {
> >>>> ...
> >>>> }
> >>>>
> >>>> @Provider
> >>>> public class ISBNFactory {
> >>>> @ProviderMethod
> >>>> public ISBN create(String value) {
> >>>> return new ISBNImpl(value);
> >>>> }
> >>>> }
> >>>>
> >>>> The @ProviderMethod could be left out if there is only one matching
> >>>> method.
> >>>> Or a new interface could be used, to be more in line with
> ExceptionMapper.
> >>>>
> >>>> I realize the spec is final, but someday the will be a 1.1 or 2.0 :)
> >>>> Any comments?
> >>>>
> >>>> Michael Brackx
> >>>>
> >>>>
> -------------------------------------------------------------------------
> >>>> This SF.Net email is sponsored by the Moblin Your Move Developer's
> >>>> challenge
> >>>> Build the coolest Linux based applications with Moblin SDK & win great
> >>>> prizes
> >>>> Grand prize is a trip for two to an Open Source event anywhere in the
> >>>> world
> >>>> http://moblin-contest.org/redirect.php?banner_id=100&url=/
> >>>> _______________________________________________
> >>>> Resteasy-developers mailing list
> >>>> Res...@li...
> >>>> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
> >>> --
> >>> Bill Burke
> >>> JBoss, a division of Red Hat
> >>> http://bill.burkecentral.com
> >>>
> >
>
> --
> Bill Burke
> JBoss, a division of Red Hat
> http://bill.burkecentral.com
>
> -------------------------------------------------------------------------
> This SF.Net email is sponsored by the Moblin Your Move Developer's
> challenge
> Build the coolest Linux based applications with Moblin SDK & win great
> prizes
> Grand prize is a trip for two to an Open Source event anywhere in the world
> http://moblin-contest.org/redirect.php?banner_id=100&url=/
> _______________________________________________
> Resteasy-developers mailing list
> Res...@li...
> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
>
|
|
From: Bill B. <bb...@re...> - 2008-10-30 12:30:36
|
Yes there is something in JAXB, but you have to hand-code each type. I
wanted to automatically convert relationships to URLs, but I just
couldn't find a way to generically do it within JAXB.
You have any ideas to get around this?
Solomon Duskis wrote:
> Is there anyway to get something like this to work with JAXB? Can a
> "Providers" use JPA/Hibernate to convert an object from and to a URL?
>
> -Solomon
>
> On Wed, Oct 29, 2008 at 5:09 PM, Bill Burke <bb...@re...
> <mailto:bb...@re...>> wrote:
>
> Implemented in Trunk:
>
> @PathParam, @QueryParam, @MatrixParam, @FormParam, and @HeaderParam are
> represented as strings in a raw HTTP request. The specification says
> that these types of injected parameters can be converted to objects if
> these objects have a valueOf(String) static method or a constructor that
> takes one String parameter. What if you have a class where valueOf() or
> this string constructor doesn't exist or is inappropriate for an HTTP
> request? Resteasy has a proprietary @Provider interface that you can
> plug in:
>
> package org.jboss.resteasy.spi;
>
> public interface StringConverter<T>
> {
> T fromString(String str);
>
> String toString(T value);
> }
>
>
> You implement this interface to provide your own custom string
> marshalling. It is registered within your web.xml under the
> resteasy.providers context-param (See Installation and Configuration
> chapter). You can do it manually by calling the
> ResteasyProviderFactory.addStringConverter() method. Here's a simple
> example of using a StringConverter:
>
> import org.jboss.resteasy.client.ProxyFactory;
> import org.jboss.resteasy.spi.StringConverter;
> import org.jboss.resteasy.test.BaseResourceTest;
> import org.junit.Assert;
> import org.junit.Before;
> import org.junit.Test;
>
> import javax.ws.rs.HeaderParam;
> import javax.ws.rs.MatrixParam;
> import javax.ws.rs.PUT;
> import javax.ws.rs.Path;
> import javax.ws.rs.PathParam;
> import javax.ws.rs.QueryParam;
> import javax.ws.rs.ext.Provider;
>
> public class StringConverterTest extends BaseResourceTest
> {
> public static class POJO
> {
> private String name;
>
> public String getName()
> {
> return name;
> }
>
> public void setName(String name)
> {
> this.name <http://this.name> = name;
> }
> }
>
> @Provider
> public static class POJOConverter implements StringConverter<POJO>
> {
> public POJO fromString(String str)
> {
> System.out.println("FROM STRNG: " + str);
> POJO pojo = new POJO();
> pojo.setName(str);
> return pojo;
> }
>
> public String toString(POJO value)
> {
> return value.getName();
> }
> }
>
> @Path("/")
> public static class MyResource
> {
> @Path("{pojo}")
> @PUT
> public void put(@QueryParam("pojo")POJO q,
> @PathParam("pojo")POJO pp,
> @MatrixParam("pojo")POJO mp,
> @HeaderParam("pojo")POJO hp)
> {
> Assert.assertEquals(q.getName(), "pojo");
> Assert.assertEquals(pp.getName(), "pojo");
> Assert.assertEquals(mp.getName(), "pojo");
> Assert.assertEquals(hp.getName(), "pojo");
> }
> }
>
> @Before
> public void setUp() throws Exception
> {
>
> dispatcher.getProviderFactory().addStringConverter(POJOConverter.class);
>
> dispatcher.getRegistry().addPerRequestResource(MyResource.class);
> }
>
> @Path("/")
> public static interface MyClient
> {
> @Path("{pojo}")
> @PUT
> void put(@QueryParam("pojo")POJO q, @PathParam("pojo")POJO pp,
> @MatrixParam("pojo")POJO mp, @HeaderParam("pojo")POJO
> hp);
> }
>
> @Test
> public void testIt() throws Exception
> {
> MyClient client = ProxyFactory.create(MyClient.class,
> "http://localhost:8081");
> POJO pojo = new POJO();
> pojo.setName("pojo");
> client.put(pojo, pojo, pojo, pojo);
> }
> }
>
>
>
> Bill Burke wrote:
> > I don't want to overload HeaderDelegate.
> >
> > I will create a new @Provider interface for this. Something like
> >
> > public interface StringConverter<T>
> > {
> > T fromString(String val);
> > String toString(T val);
> > }
> >
> > And then allow its use with @HeaderParam, @QueryParam, @PathParam,
> > @MatrixParam, and @FormParam injected objects.
> >
> > Sound good?
> >
> > Michael Brackx wrote:
> >> That would be nice.
> >> How could a HeaderDelegate be "activated" for a parameter?
> >>
> >> Michael
> >>
> >> On Fri, Oct 24, 2008 at 6:19 PM, Bill Burke <bb...@re...
> <mailto:bb...@re...>> wrote:
> >>> There's is HeaderDelegate in the specification. I could make
> sure that is
> >>> used for all String parameters.
> >>>
> >>> Michael Brackx wrote:
> >>>> Hi,
> >>>>
> >>>> It would be nice to have some sort of custom parameter
> unmarshalling.
> >>>> Currently parameter types can be String, primitive, or a class
> that
> >>>> has a String constructor or static valueOf(String) method.
> >>>> Some use cases:
> >>>> - injecting interfaces
> >>>> - injecting Enums (they already have a static valueOf(String)
> method)
> >>>> - injecting thirdparty classes
> >>>> - injecting factory created objects
> >>>>
> >>>> example:
> >>>>
> >>>> @GET
> >>>> @Path("/book/{isbn}")
> >>>> public String getBook(@PathParm(value = "isbn", provider =
> >>>> ISBNFactory.class) ISBN id) {
> >>>> ...
> >>>> }
> >>>>
> >>>> @Provider
> >>>> public class ISBNFactory {
> >>>> @ProviderMethod
> >>>> public ISBN create(String value) {
> >>>> return new ISBNImpl(value);
> >>>> }
> >>>> }
> >>>>
> >>>> The @ProviderMethod could be left out if there is only one
> matching
> >>>> method.
> >>>> Or a new interface could be used, to be more in line with
> ExceptionMapper.
> >>>>
> >>>> I realize the spec is final, but someday the will be a 1.1 or
> 2.0 :)
> >>>> Any comments?
> >>>>
> >>>> Michael Brackx
> >>>>
> >>>>
> -------------------------------------------------------------------------
> >>>> This SF.Net email is sponsored by the Moblin Your Move Developer's
> >>>> challenge
> >>>> Build the coolest Linux based applications with Moblin SDK &
> win great
> >>>> prizes
> >>>> Grand prize is a trip for two to an Open Source event anywhere
> in the
> >>>> world
> >>>> http://moblin-contest.org/redirect.php?banner_id=100&url=/
> <http://moblin-contest.org/redirect.php?banner_id=100&url=/>
> >>>> _______________________________________________
> >>>> Resteasy-developers mailing list
> >>>> Res...@li...
> <mailto:Res...@li...>
> >>>> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
> >>> --
> >>> Bill Burke
> >>> JBoss, a division of Red Hat
> >>> http://bill.burkecentral.com
> >>>
> >
>
> --
> Bill Burke
> JBoss, a division of Red Hat
> http://bill.burkecentral.com
>
> -------------------------------------------------------------------------
> This SF.Net email is sponsored by the Moblin Your Move Developer's
> challenge
> Build the coolest Linux based applications with Moblin SDK & win
> great prizes
> Grand prize is a trip for two to an Open Source event anywhere in
> the world
> http://moblin-contest.org/redirect.php?banner_id=100&url=/
> <http://moblin-contest.org/redirect.php?banner_id=100&url=/>
> _______________________________________________
> Resteasy-developers mailing list
> Res...@li...
> <mailto:Res...@li...>
> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
>
>
--
Bill Burke
JBoss, a division of Red Hat
http://bill.burkecentral.com
|
|
From: Solomon D. <sd...@gm...> - 2008-10-30 17:58:05
|
I'm not familiar withe JAXB runtime. How would you hand-code each type? Do
you mean take MyJPAObject and wrap it in MyJPAObjectJAXBWrapper? That's
what Jersy/Netbeans does, which really sucks. This is a fundamental
imedence mismatch between RESTful data and relational data. I'm not sure
how to solve it, but it should be solved.
-Solomon
On Thu, Oct 30, 2008 at 8:30 AM, Bill Burke <bb...@re...> wrote:
> Yes there is something in JAXB, but you have to hand-code each type. I
> wanted to automatically convert relationships to URLs, but I just couldn't
> find a way to generically do it within JAXB.
>
> You have any ideas to get around this?
>
> Solomon Duskis wrote:
>
>> Is there anyway to get something like this to work with JAXB? Can a
>> "Providers" use JPA/Hibernate to convert an object from and to a URL?
>>
>> -Solomon
>>
>> On Wed, Oct 29, 2008 at 5:09 PM, Bill Burke <bb...@re... <mailto:
>> bb...@re...>> wrote:
>>
>> Implemented in Trunk:
>>
>> @PathParam, @QueryParam, @MatrixParam, @FormParam, and @HeaderParam are
>> represented as strings in a raw HTTP request. The specification says
>> that these types of injected parameters can be converted to objects if
>> these objects have a valueOf(String) static method or a constructor
>> that
>> takes one String parameter. What if you have a class where valueOf() or
>> this string constructor doesn't exist or is inappropriate for an HTTP
>> request? Resteasy has a proprietary @Provider interface that you can
>> plug in:
>>
>> package org.jboss.resteasy.spi;
>>
>> public interface StringConverter<T>
>> {
>> T fromString(String str);
>>
>> String toString(T value);
>> }
>>
>>
>> You implement this interface to provide your own custom string
>> marshalling. It is registered within your web.xml under the
>> resteasy.providers context-param (See Installation and Configuration
>> chapter). You can do it manually by calling the
>> ResteasyProviderFactory.addStringConverter() method. Here's a simple
>> example of using a StringConverter:
>>
>> import org.jboss.resteasy.client.ProxyFactory;
>> import org.jboss.resteasy.spi.StringConverter;
>> import org.jboss.resteasy.test.BaseResourceTest;
>> import org.junit.Assert;
>> import org.junit.Before;
>> import org.junit.Test;
>>
>> import javax.ws.rs.HeaderParam;
>> import javax.ws.rs.MatrixParam;
>> import javax.ws.rs.PUT;
>> import javax.ws.rs.Path;
>> import javax.ws.rs.PathParam;
>> import javax.ws.rs.QueryParam;
>> import javax.ws.rs.ext.Provider;
>>
>> public class StringConverterTest extends BaseResourceTest
>> {
>> public static class POJO
>> {
>> private String name;
>>
>> public String getName()
>> {
>> return name;
>> }
>>
>> public void setName(String name)
>> {
>> this.name <http://this.name> = name;
>>
>> }
>> }
>>
>> @Provider
>> public static class POJOConverter implements
>> StringConverter<POJO>
>> {
>> public POJO fromString(String str)
>> {
>> System.out.println("FROM STRNG: " + str);
>> POJO pojo = new POJO();
>> pojo.setName(str);
>> return pojo;
>> }
>>
>> public String toString(POJO value)
>> {
>> return value.getName();
>> }
>> }
>>
>> @Path("/")
>> public static class MyResource
>> {
>> @Path("{pojo}")
>> @PUT
>> public void put(@QueryParam("pojo")POJO q,
>> @PathParam("pojo")POJO pp,
>> @MatrixParam("pojo")POJO mp,
>> @HeaderParam("pojo")POJO hp)
>> {
>> Assert.assertEquals(q.getName(), "pojo");
>> Assert.assertEquals(pp.getName(), "pojo");
>> Assert.assertEquals(mp.getName(), "pojo");
>> Assert.assertEquals(hp.getName(), "pojo");
>> }
>> }
>>
>> @Before
>> public void setUp() throws Exception
>> {
>>
>>
>> dispatcher.getProviderFactory().addStringConverter(POJOConverter.class);
>>
>> dispatcher.getRegistry().addPerRequestResource(MyResource.class);
>> }
>>
>> @Path("/")
>> public static interface MyClient
>> {
>> @Path("{pojo}")
>> @PUT
>> void put(@QueryParam("pojo")POJO q, @PathParam("pojo")POJO pp,
>> @MatrixParam("pojo")POJO mp, @HeaderParam("pojo")POJO
>> hp);
>> }
>>
>> @Test
>> public void testIt() throws Exception
>> {
>> MyClient client = ProxyFactory.create(MyClient.class,
>> "http://localhost:8081");
>> POJO pojo = new POJO();
>> pojo.setName("pojo");
>> client.put(pojo, pojo, pojo, pojo);
>> }
>> }
>>
>>
>>
>> Bill Burke wrote:
>> > I don't want to overload HeaderDelegate.
>> >
>> > I will create a new @Provider interface for this. Something like
>> >
>> > public interface StringConverter<T>
>> > {
>> > T fromString(String val);
>> > String toString(T val);
>> > }
>> >
>> > And then allow its use with @HeaderParam, @QueryParam, @PathParam,
>> > @MatrixParam, and @FormParam injected objects.
>> >
>> > Sound good?
>> >
>> > Michael Brackx wrote:
>> >> That would be nice.
>> >> How could a HeaderDelegate be "activated" for a parameter?
>> >>
>> >> Michael
>> >>
>> >> On Fri, Oct 24, 2008 at 6:19 PM, Bill Burke <bb...@re...
>> <mailto:bb...@re...>> wrote:
>> >>> There's is HeaderDelegate in the specification. I could make
>> sure that is
>> >>> used for all String parameters.
>> >>>
>> >>> Michael Brackx wrote:
>> >>>> Hi,
>> >>>>
>> >>>> It would be nice to have some sort of custom parameter
>> unmarshalling.
>> >>>> Currently parameter types can be String, primitive, or a class
>> that
>> >>>> has a String constructor or static valueOf(String) method.
>> >>>> Some use cases:
>> >>>> - injecting interfaces
>> >>>> - injecting Enums (they already have a static valueOf(String)
>> method)
>> >>>> - injecting thirdparty classes
>> >>>> - injecting factory created objects
>> >>>>
>> >>>> example:
>> >>>>
>> >>>> @GET
>> >>>> @Path("/book/{isbn}")
>> >>>> public String getBook(@PathParm(value = "isbn", provider =
>> >>>> ISBNFactory.class) ISBN id) {
>> >>>> ...
>> >>>> }
>> >>>>
>> >>>> @Provider
>> >>>> public class ISBNFactory {
>> >>>> @ProviderMethod
>> >>>> public ISBN create(String value) {
>> >>>> return new ISBNImpl(value);
>> >>>> }
>> >>>> }
>> >>>>
>> >>>> The @ProviderMethod could be left out if there is only one
>> matching
>> >>>> method.
>> >>>> Or a new interface could be used, to be more in line with
>> ExceptionMapper.
>> >>>>
>> >>>> I realize the spec is final, but someday the will be a 1.1 or
>> 2.0 :)
>> >>>> Any comments?
>> >>>>
>> >>>> Michael Brackx
>> >>>>
>> >>>>
>>
>> -------------------------------------------------------------------------
>> >>>> This SF.Net email is sponsored by the Moblin Your Move
>> Developer's
>> >>>> challenge
>> >>>> Build the coolest Linux based applications with Moblin SDK &
>> win great
>> >>>> prizes
>> >>>> Grand prize is a trip for two to an Open Source event anywhere
>> in the
>> >>>> world
>> >>>> http://moblin-contest.org/redirect.php?banner_id=100&url=/
>> <http://moblin-contest.org/redirect.php?banner_id=100&url=/>
>> >>>> _______________________________________________
>> >>>> Resteasy-developers mailing list
>> >>>> Res...@li...
>> <mailto:Res...@li...>
>> >>>> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
>> >>> --
>> >>> Bill Burke
>> >>> JBoss, a division of Red Hat
>> >>> http://bill.burkecentral.com
>> >>>
>> >
>>
>> --
>> Bill Burke
>> JBoss, a division of Red Hat
>> http://bill.burkecentral.com
>>
>>
>> -------------------------------------------------------------------------
>> This SF.Net email is sponsored by the Moblin Your Move Developer's
>> challenge
>> Build the coolest Linux based applications with Moblin SDK & win
>> great prizes
>> Grand prize is a trip for two to an Open Source event anywhere in
>> the world
>> http://moblin-contest.org/redirect.php?banner_id=100&url=/
>> <http://moblin-contest.org/redirect.php?banner_id=100&url=/>
>> _______________________________________________
>> Resteasy-developers mailing list
>> Res...@li...
>> <mailto:Res...@li...>
>> https://lists.sourceforge.net/lists/listinfo/resteasy-developers
>>
>>
>>
> --
> Bill Burke
> JBoss, a division of Red Hat
> http://bill.burkecentral.com
>
|