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 <[email protected]> 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 > > >
