You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by David Leangen <os...@leangen.net> on 2016/08/12 03:11:04 UTC
[Converter] Embedded Types
Hi!
Am I doing something wrong, or have I stumbled across something that has not yet been implemented?
My understanding is that I should be able to register a rule for an embedded object. Example:
public static class MyObject {
enum MyEnum { ONE, TWO, THREE };
public MyObject(){}
public MyEnum getValue() {
return MyEnum.ONE;
}
}
public static class MyDTO extends DTO {
public String value;
}
MyObject o = new MyObject();
Adapter ad = converter.getAdapter().rule( String.class, MyObject.MyEnum.class, v -> MyObject.MyEnum.valueOf( v ), v -> v.name() );
MyDTO my = ad.convert( o ).to( MyDTO.class );
However, this throws an Exception:
org.osgi.service.converter.ConversionException: Cannot create DTO class MyDTO
at org.apache.felix.converter.impl.ConvertingImpl.convertToDTO(ConvertingImpl.java:240)
at org.apache.felix.converter.impl.ConvertingImpl.to(ConvertingImpl.java:136)
at org.apache.felix.converter.impl.AdapterImpl$ConvertingWrapper.to(AdapterImpl.java:145)
at org.apache.felix.converter.impl.AdapterImpl$ConvertingWrapper.to(AdapterImpl.java:145)
at org.apache.felix.converter.impl.AdapterImpl$ConvertingWrapper.to(AdapterImpl.java:119)
... plenty more
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field MyDTO.value to MyObject$MyEnum
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:764)
at org.apache.felix.converter.impl.ConvertingImpl.convertToDTO(ConvertingImpl.java:233)
... 39 more
Looks like the rule is not getting applied. Indeed, when I step through the code, I cannot see any place where the rule is taken into account.
Cheers,
=David
Re: [Converter] Embedded Types
Posted by Management <ma...@leangen.net>.
Thanks, David B! I take it that my assumption is correct, then.
Will look into this as soon as I can.
Cheers,
=David
> On Aug 12, 2016, at 6:09 PM, David Bosschaert <da...@gmail.com> wrote:
>
> Hi David,
>
> The rules are applied in AdapterImpl.ConvertingWrapper.to() where they are
> looked up in a map of class rules.
>
> If you find that the current implementation does not support the case you
> have above, it would be great if you could come up with a patch :)
>
> Cheers,
>
> David
>
> On 12 August 2016 at 04:11, David Leangen <os...@leangen.net> wrote:
>
>>
>> Hi!
>>
>> Am I doing something wrong, or have I stumbled across something that has
>> not yet been implemented?
>>
>> My understanding is that I should be able to register a rule for an
>> embedded object. Example:
>>
>> public static class MyObject {
>> enum MyEnum { ONE, TWO, THREE };
>>
>> public MyObject(){}
>>
>> public MyEnum getValue() {
>> return MyEnum.ONE;
>> }
>> }
>>
>> public static class MyDTO extends DTO {
>> public String value;
>> }
>>
>> MyObject o = new MyObject();
>> Adapter ad = converter.getAdapter().rule( String.class,
>> MyObject.MyEnum.class, v -> MyObject.MyEnum.valueOf( v ), v -> v.name() );
>> MyDTO my = ad.convert( o ).to( MyDTO.class );
>>
>>
>> However, this throws an Exception:
>>
>> org.osgi.service.converter.ConversionException: Cannot create DTO class
>> MyDTO
>> at org.apache.felix.converter.impl.ConvertingImpl.
>> convertToDTO(ConvertingImpl.java:240)
>> at org.apache.felix.converter.impl.ConvertingImpl.to(
>> ConvertingImpl.java:136)
>> at org.apache.felix.converter.impl.AdapterImpl$
>> ConvertingWrapper.to(AdapterImpl.java:145)
>> at org.apache.felix.converter.impl.AdapterImpl$
>> ConvertingWrapper.to(AdapterImpl.java:145)
>> at org.apache.felix.converter.impl.AdapterImpl$
>> ConvertingWrapper.to(AdapterImpl.java:119)
>> ... plenty more
>> Caused by: java.lang.IllegalArgumentException: Can not set
>> java.lang.String field MyDTO.value to MyObject$MyEnum
>> at sun.reflect.UnsafeFieldAccessorImpl.
>> throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
>> at sun.reflect.UnsafeFieldAccessorImpl.
>> throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
>> at sun.reflect.UnsafeObjectFieldAccessorImpl.set(
>> UnsafeObjectFieldAccessorImpl.java:81)
>> at java.lang.reflect.Field.set(Field.java:764)
>> at org.apache.felix.converter.impl.ConvertingImpl.
>> convertToDTO(ConvertingImpl.java:233)
>> ... 39 more
>>
>> Looks like the rule is not getting applied. Indeed, when I step through
>> the code, I cannot see any place where the rule is taken into account.
>>
>>
>> Cheers,
>> =David
>>
>>
>>
Re: [Converter] Embedded Types
Posted by David Bosschaert <da...@gmail.com>.
That's great, David!
I've just added a 'Converter' component to JIRA. Hope that works :)
Cheers,
David
On 15 August 2016 at 13:20, David Leangen <os...@leangen.net> wrote:
>
> Hey David B.,
>
> I updated the code. How should I submit the patch? I did not see a JIRA
> component for this.
>
>
> Cheers,
> =David
>
>
>
>
> > On Aug 13, 2016, at 4:19 PM, David Leangen <os...@leangen.net> wrote:
> >
> >
> > Thanks, David B! I take it that my assumption is correct, then.
> >
> > Will look into this as soon as I can.
> >
> >
> > Cheers,
> > =David
> >
> >
> >> On Aug 12, 2016, at 6:09 PM, David Bosschaert <
> david.bosschaert@gmail.com> wrote:
> >>
> >> Hi David,
> >>
> >> The rules are applied in AdapterImpl.ConvertingWrapper.to() where they
> are
> >> looked up in a map of class rules.
> >>
> >> If you find that the current implementation does not support the case
> you
> >> have above, it would be great if you could come up with a patch :)
> >>
> >> Cheers,
> >>
> >> David
> >>
> >> On 12 August 2016 at 04:11, David Leangen <os...@leangen.net> wrote:
> >>
> >>>
> >>> Hi!
> >>>
> >>> Am I doing something wrong, or have I stumbled across something that
> has
> >>> not yet been implemented?
> >>>
> >>> My understanding is that I should be able to register a rule for an
> >>> embedded object. Example:
> >>>
> >>> public static class MyObject {
> >>> enum MyEnum { ONE, TWO, THREE };
> >>>
> >>> public MyObject(){}
> >>>
> >>> public MyEnum getValue() {
> >>> return MyEnum.ONE;
> >>> }
> >>> }
> >>>
> >>> public static class MyDTO extends DTO {
> >>> public String value;
> >>> }
> >>>
> >>> MyObject o = new MyObject();
> >>> Adapter ad = converter.getAdapter().rule( String.class,
> >>> MyObject.MyEnum.class, v -> MyObject.MyEnum.valueOf( v ), v -> v.name()
> );
> >>> MyDTO my = ad.convert( o ).to( MyDTO.class );
> >>>
> >>>
> >>> However, this throws an Exception:
> >>>
> >>> org.osgi.service.converter.ConversionException: Cannot create DTO
> class
> >>> MyDTO
> >>> at org.apache.felix.converter.impl.ConvertingImpl.
> >>> convertToDTO(ConvertingImpl.java:240)
> >>> at org.apache.felix.converter.impl.ConvertingImpl.to(
> >>> ConvertingImpl.java:136)
> >>> at org.apache.felix.converter.impl.AdapterImpl$
> >>> ConvertingWrapper.to(AdapterImpl.java:145)
> >>> at org.apache.felix.converter.impl.AdapterImpl$
> >>> ConvertingWrapper.to(AdapterImpl.java:145)
> >>> at org.apache.felix.converter.impl.AdapterImpl$
> >>> ConvertingWrapper.to(AdapterImpl.java:119)
> >>> ... plenty more
> >>> Caused by: java.lang.IllegalArgumentException: Can not set
> >>> java.lang.String field MyDTO.value to MyObject$MyEnum
> >>> at sun.reflect.UnsafeFieldAccessorImpl.
> >>> throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
> >>> at sun.reflect.UnsafeFieldAccessorImpl.
> >>> throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
> >>> at sun.reflect.UnsafeObjectFieldAccessorImpl.set(
> >>> UnsafeObjectFieldAccessorImpl.java:81)
> >>> at java.lang.reflect.Field.set(Field.java:764)
> >>> at org.apache.felix.converter.impl.ConvertingImpl.
> >>> convertToDTO(ConvertingImpl.java:233)
> >>> ... 39 more
> >>>
> >>> Looks like the rule is not getting applied. Indeed, when I step through
> >>> the code, I cannot see any place where the rule is taken into account.
> >>>
> >>>
> >>> Cheers,
> >>> =David
> >>>
> >>>
> >>>
> >
>
>
Re: [Converter] Embedded Types
Posted by David Leangen <os...@leangen.net>.
Hey David B.,
I updated the code. How should I submit the patch? I did not see a JIRA component for this.
Cheers,
=David
> On Aug 13, 2016, at 4:19 PM, David Leangen <os...@leangen.net> wrote:
>
>
> Thanks, David B! I take it that my assumption is correct, then.
>
> Will look into this as soon as I can.
>
>
> Cheers,
> =David
>
>
>> On Aug 12, 2016, at 6:09 PM, David Bosschaert <da...@gmail.com> wrote:
>>
>> Hi David,
>>
>> The rules are applied in AdapterImpl.ConvertingWrapper.to() where they are
>> looked up in a map of class rules.
>>
>> If you find that the current implementation does not support the case you
>> have above, it would be great if you could come up with a patch :)
>>
>> Cheers,
>>
>> David
>>
>> On 12 August 2016 at 04:11, David Leangen <os...@leangen.net> wrote:
>>
>>>
>>> Hi!
>>>
>>> Am I doing something wrong, or have I stumbled across something that has
>>> not yet been implemented?
>>>
>>> My understanding is that I should be able to register a rule for an
>>> embedded object. Example:
>>>
>>> public static class MyObject {
>>> enum MyEnum { ONE, TWO, THREE };
>>>
>>> public MyObject(){}
>>>
>>> public MyEnum getValue() {
>>> return MyEnum.ONE;
>>> }
>>> }
>>>
>>> public static class MyDTO extends DTO {
>>> public String value;
>>> }
>>>
>>> MyObject o = new MyObject();
>>> Adapter ad = converter.getAdapter().rule( String.class,
>>> MyObject.MyEnum.class, v -> MyObject.MyEnum.valueOf( v ), v -> v.name() );
>>> MyDTO my = ad.convert( o ).to( MyDTO.class );
>>>
>>>
>>> However, this throws an Exception:
>>>
>>> org.osgi.service.converter.ConversionException: Cannot create DTO class
>>> MyDTO
>>> at org.apache.felix.converter.impl.ConvertingImpl.
>>> convertToDTO(ConvertingImpl.java:240)
>>> at org.apache.felix.converter.impl.ConvertingImpl.to(
>>> ConvertingImpl.java:136)
>>> at org.apache.felix.converter.impl.AdapterImpl$
>>> ConvertingWrapper.to(AdapterImpl.java:145)
>>> at org.apache.felix.converter.impl.AdapterImpl$
>>> ConvertingWrapper.to(AdapterImpl.java:145)
>>> at org.apache.felix.converter.impl.AdapterImpl$
>>> ConvertingWrapper.to(AdapterImpl.java:119)
>>> ... plenty more
>>> Caused by: java.lang.IllegalArgumentException: Can not set
>>> java.lang.String field MyDTO.value to MyObject$MyEnum
>>> at sun.reflect.UnsafeFieldAccessorImpl.
>>> throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
>>> at sun.reflect.UnsafeFieldAccessorImpl.
>>> throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
>>> at sun.reflect.UnsafeObjectFieldAccessorImpl.set(
>>> UnsafeObjectFieldAccessorImpl.java:81)
>>> at java.lang.reflect.Field.set(Field.java:764)
>>> at org.apache.felix.converter.impl.ConvertingImpl.
>>> convertToDTO(ConvertingImpl.java:233)
>>> ... 39 more
>>>
>>> Looks like the rule is not getting applied. Indeed, when I step through
>>> the code, I cannot see any place where the rule is taken into account.
>>>
>>>
>>> Cheers,
>>> =David
>>>
>>>
>>>
>
Re: [Converter] Embedded Types
Posted by David Leangen <os...@leangen.net>.
Thanks, David B! I take it that my assumption is correct, then.
Will look into this as soon as I can.
Cheers,
=David
> On Aug 12, 2016, at 6:09 PM, David Bosschaert <da...@gmail.com> wrote:
>
> Hi David,
>
> The rules are applied in AdapterImpl.ConvertingWrapper.to() where they are
> looked up in a map of class rules.
>
> If you find that the current implementation does not support the case you
> have above, it would be great if you could come up with a patch :)
>
> Cheers,
>
> David
>
> On 12 August 2016 at 04:11, David Leangen <os...@leangen.net> wrote:
>
>>
>> Hi!
>>
>> Am I doing something wrong, or have I stumbled across something that has
>> not yet been implemented?
>>
>> My understanding is that I should be able to register a rule for an
>> embedded object. Example:
>>
>> public static class MyObject {
>> enum MyEnum { ONE, TWO, THREE };
>>
>> public MyObject(){}
>>
>> public MyEnum getValue() {
>> return MyEnum.ONE;
>> }
>> }
>>
>> public static class MyDTO extends DTO {
>> public String value;
>> }
>>
>> MyObject o = new MyObject();
>> Adapter ad = converter.getAdapter().rule( String.class,
>> MyObject.MyEnum.class, v -> MyObject.MyEnum.valueOf( v ), v -> v.name() );
>> MyDTO my = ad.convert( o ).to( MyDTO.class );
>>
>>
>> However, this throws an Exception:
>>
>> org.osgi.service.converter.ConversionException: Cannot create DTO class
>> MyDTO
>> at org.apache.felix.converter.impl.ConvertingImpl.
>> convertToDTO(ConvertingImpl.java:240)
>> at org.apache.felix.converter.impl.ConvertingImpl.to(
>> ConvertingImpl.java:136)
>> at org.apache.felix.converter.impl.AdapterImpl$
>> ConvertingWrapper.to(AdapterImpl.java:145)
>> at org.apache.felix.converter.impl.AdapterImpl$
>> ConvertingWrapper.to(AdapterImpl.java:145)
>> at org.apache.felix.converter.impl.AdapterImpl$
>> ConvertingWrapper.to(AdapterImpl.java:119)
>> ... plenty more
>> Caused by: java.lang.IllegalArgumentException: Can not set
>> java.lang.String field MyDTO.value to MyObject$MyEnum
>> at sun.reflect.UnsafeFieldAccessorImpl.
>> throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
>> at sun.reflect.UnsafeFieldAccessorImpl.
>> throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
>> at sun.reflect.UnsafeObjectFieldAccessorImpl.set(
>> UnsafeObjectFieldAccessorImpl.java:81)
>> at java.lang.reflect.Field.set(Field.java:764)
>> at org.apache.felix.converter.impl.ConvertingImpl.
>> convertToDTO(ConvertingImpl.java:233)
>> ... 39 more
>>
>> Looks like the rule is not getting applied. Indeed, when I step through
>> the code, I cannot see any place where the rule is taken into account.
>>
>>
>> Cheers,
>> =David
>>
>>
>>
Re: [Converter] Embedded Types
Posted by David Bosschaert <da...@gmail.com>.
Hi David,
The rules are applied in AdapterImpl.ConvertingWrapper.to() where they are
looked up in a map of class rules.
If you find that the current implementation does not support the case you
have above, it would be great if you could come up with a patch :)
Cheers,
David
On 12 August 2016 at 04:11, David Leangen <os...@leangen.net> wrote:
>
> Hi!
>
> Am I doing something wrong, or have I stumbled across something that has
> not yet been implemented?
>
> My understanding is that I should be able to register a rule for an
> embedded object. Example:
>
> public static class MyObject {
> enum MyEnum { ONE, TWO, THREE };
>
> public MyObject(){}
>
> public MyEnum getValue() {
> return MyEnum.ONE;
> }
> }
>
> public static class MyDTO extends DTO {
> public String value;
> }
>
> MyObject o = new MyObject();
> Adapter ad = converter.getAdapter().rule( String.class,
> MyObject.MyEnum.class, v -> MyObject.MyEnum.valueOf( v ), v -> v.name() );
> MyDTO my = ad.convert( o ).to( MyDTO.class );
>
>
> However, this throws an Exception:
>
> org.osgi.service.converter.ConversionException: Cannot create DTO class
> MyDTO
> at org.apache.felix.converter.impl.ConvertingImpl.
> convertToDTO(ConvertingImpl.java:240)
> at org.apache.felix.converter.impl.ConvertingImpl.to(
> ConvertingImpl.java:136)
> at org.apache.felix.converter.impl.AdapterImpl$
> ConvertingWrapper.to(AdapterImpl.java:145)
> at org.apache.felix.converter.impl.AdapterImpl$
> ConvertingWrapper.to(AdapterImpl.java:145)
> at org.apache.felix.converter.impl.AdapterImpl$
> ConvertingWrapper.to(AdapterImpl.java:119)
> ... plenty more
> Caused by: java.lang.IllegalArgumentException: Can not set
> java.lang.String field MyDTO.value to MyObject$MyEnum
> at sun.reflect.UnsafeFieldAccessorImpl.
> throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
> at sun.reflect.UnsafeFieldAccessorImpl.
> throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
> at sun.reflect.UnsafeObjectFieldAccessorImpl.set(
> UnsafeObjectFieldAccessorImpl.java:81)
> at java.lang.reflect.Field.set(Field.java:764)
> at org.apache.felix.converter.impl.ConvertingImpl.
> convertToDTO(ConvertingImpl.java:233)
> ... 39 more
>
> Looks like the rule is not getting applied. Indeed, when I step through
> the code, I cannot see any place where the rule is taken into account.
>
>
> Cheers,
> =David
>
>
>