I've updated the code to take care of the scenario you described, hope it works for you now
Sergey On Sat, Apr 9, 2011 at 2:14 PM, [email protected] <[email protected]>wrote: > >> Reusing existing XmlAdapters makes sense to me, so I updated the >> trunk/2.3.x >> for adapters be checked when processing all types of JAX-RS parameters >> >> Give it a try please with the latest code >> > > It doesnt work, I will explain what happens in the current code: > > I have a method annotated this way: > > void methodA( @PathParam("id") > @XmlJavaTypeAdapter(ValueTypeToBoundTypeAdapter.class) param1); > > So actually InjectionUtils.handleParameter() now tries to convert a String > from the URI in the following way: > > it searches for "fromString", "fromValue", .. in type BoundType (which is > the pClass parameter). > This will fail (result=null) and then it tries to convert the String to > BoundType using JAXBUtils.convertWithAdapter(), which will use > ValueTypeToBoundTypeAdapter. However ValueTypeToBoundTypeAdapter can only > convert ValueType to BoundType, and ValueType is no String, but has a > fromString() method. > > So what should happen (at least what I expect), is that > ValueType.fromString(String) called and the resulting ValueType is converted > using ValueTypeToBoundTypeAdapter to a BoundType. > > The following code would fix it: > > Replace > > // check constructors accepting a single String value > > by > > // convert from BoundType to ValueType if adapter is present > pClass = getActualType(pClass, pClass, paramAnns); > // check constructors accepting a single String value > > > and replace > > > if (result == null) { > // as the last resort, try XmlJavaTypeAdapters > try { > result = JAXBUtils.convertWithAdapter(value, paramAnns); > } catch (Throwable ex) { > // ignore - may be to do with JAXB classes not being > available > } > } > > by > > // apply XmlJavaTypeAdapters if present > try { > result = JAXBUtils.useAdapter(result != null ? > result : value, AnnotationUtils.getAnnotation(paramAnns, > XmlJavaTypeAdapter.class), false, result); > } catch (Throwable ex) { > // ignore - may be to do with JAXB classes not being > available > } > > > > I also copied getActualType(.,.,.) and getAdapter(.,.) from > AbstractJAXBProvider. With this fix, all my tests work. > -- Sergey Beryozkin Application Integration Division of Talend <http://www.talend.com> http://sberyozkin.blogspot.com
