For DTOs, I think the following should be ok:
class MyDTO {
List<Long> foo;
}
In any case, I think the converter should try to honour generics where
possible, so if you have a JavaBean with generics it should also work
class FooBean<T> {
T getFoo();
}
In this case you should be able to do:
FooBean<Bar> foo = converter.convert(something).to(new
TypeReference<FooBean<Bar>>(){});
I don't think it's implemented for JavaBeans yet, but I'll try to add this
soon.
Cheers,
David
On 24 August 2016 at 20:06, Raymond Auge <[email protected]> wrote:
> I'm not really sure that defining DTOs with generics is even acceptable!
>
> I think the primary point of a DTO is to be completely concrete.
>
> - Ray
>
> On Wed, Aug 24, 2016 at 1:39 PM, David Bosschaert <
> [email protected]> wrote:
>
> > BTW I'm just noticing that the generic type arguments are not yet used
> for
> > conversions to DTOs, if you have a test case or even a patch that would
> be
> > great :)
> >
> > Cheers,
> >
> > David
> >
> > On 24 August 2016 at 18:38, David Bosschaert <[email protected]
> >
> > wrote:
> >
> > > Hi David,
> > >
> > > The current converter implementation actually has (some) support for
> this
> > > already via the TypeReference-based APIs. Basically this generic
> > > information is preserved if you create a subclass for your type, and
> the
> > > way to do this is by creating an (anonymous) TypeReference subclass.
> > >
> > > You can find an example in the ConverterMapTest.
> > testGenericMapConversion()
> > > [1]
> > >
> > > Basically what that test does is convert this map:
> > > Map<Integer, String> m1 = Collections.singletonMap(42, "987654321");
> > > into a Map<String, Long>. So the number 42 needs to be converted into a
> > > String and the string "987654321" needs to be converted into a long.
> > >
> > > An anonymous TypeReference subclass is used to tell the converter to do
> > > this:
> > > Map<String, Long> m2 = converter.convert(m1).to(new
> > > TypeReference<Map<String, Long>>(){});
> > >
> > > Then at then end of the test you'll see that the correct converted
> types
> > > are being converted to are asserted.
> > >
> > > So in your case you should be able to specify the conversion as:
> > > TopDTO<BottomDTO> dto = converter.convert(someMap).to(new
> > > TypeReference<TopDTO<BottomDTO>>(){});
> > >
> > > Hope this works for you :) The implementation of TypeReference-based
> APIs
> > > isn't completely finished, so if you find an issue, let us know!
> > >
> > > Cheers,
> > >
> > > David
> > >
> > > [1] https://svn.apache.org/viewvc/felix/trunk/converter/
> > > src/test/java/org/apache/felix/converter/impl/
> > ConverterMapTest.java?view=
> > > markup#l54
> > >
> > > On 24 August 2016 at 18:21, David Leangen <[email protected]> wrote:
> > >
> > >>
> > >> Hi!
> > >>
> > >> I’m having a bit of trouble, so am fishing for ideas. Maybe there is a
> > >> simple answer.
> > >>
> > >> If I convert from Map—>DTO, and the DTO has in its tree a generic
> field,
> > >> how can I tell the converter the correct type so that it does not get
> > >> converted as a Map?
> > >>
> > >> Example:
> > >>
> > >> BottomDTO {
> > >> public String a;
> > >> public String b;
> > >>
> > >> MiddleDTO<T> {
> > >> public T bottom;
> > >> }
> > >>
> > >> TopDTO<T> {
> > >> public MiddleDTO<T> middle;
> > >> }
> > >>
> > >> If I just do this, then Map is used for the value of bottom, which
> will
> > >> cause a ClassCastException sometime later during execution:
> > >>
> > >> // Convert from Map to TopDTO<BottomDTO>
> > >> converter.convert(someMap).to(TopDTO.class);
> > >>
> > >>
> > >> Thanks!
> > >> =David
> > >>
> > >>
> > >>
> > >
> >
>
>
>
> --
> *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
> (@rotty3000)
> Senior Software Architect *Liferay, Inc.* <http://www.liferay.com>
> (@Liferay)
> Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org>
> (@OSGiAlliance)
>