Index: resteasy-jaxrs/src/test/java/org/jboss/resteasy/core/StringParameterInjectorTest.java =================================================================== --- resteasy-jaxrs/src/test/java/org/jboss/resteasy/core/StringParameterInjectorTest.java (revision 0) +++ resteasy-jaxrs/src/test/java/org/jboss/resteasy/core/StringParameterInjectorTest.java (revision 0) @@ -0,0 +1,85 @@ +package org.jboss.resteasy.core; + +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertNotNull; + +import java.lang.annotation.Annotation; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.Field; + +import javax.ws.rs.core.Context; + +import org.jboss.resteasy.annotations.StringParameterUnmarshallerBinder; +import org.jboss.resteasy.spi.ResteasyProviderFactory; +import org.jboss.resteasy.spi.StringParameterUnmarshaller; +import org.junit.Ignore; +import org.junit.Test; + +public class StringParameterInjectorTest { + + private static final String MY_SPECIAL_STRING = "MySpecialString"; + + @Test @Ignore("Fails because of RESTEASY-584") + public void shouldInjectForFactoryConfiguredUnmarshaller() throws Exception { + ResteasyProviderFactory factory = new ResteasyProviderFactory(); + factory.addStringParameterUnmarshaller(SpecialStringUnmarshaller.class); + assertNotNull(factory.createStringParameterUnmarshaller(String.class)); + + ResteasyProviderFactory.pushContext(Injected.class, new Injected(MY_SPECIAL_STRING)); + + StringParameterInjector injector = new StringParameterInjector(String.class, String.class, "name", + MyType.class, null, MyType.class.getDeclaredField("name"), + new Annotation[0], factory); + + assertSame(MY_SPECIAL_STRING, injector.extractValue("ignored")); + } + + @Test + public void shouldInjectForAnnotationConfiguredUnmarshaller() throws Exception { + ResteasyProviderFactory.pushContext(Injected.class, new Injected(MY_SPECIAL_STRING)); + + Field declaredField = MyType.class.getDeclaredField("name"); + StringParameterInjector injector = new StringParameterInjector(String.class, String.class, "name", + MyType.class, null, declaredField, + declaredField.getAnnotations(), new ResteasyProviderFactory()); + + assertSame(MY_SPECIAL_STRING, injector.extractValue("ignored")); + } + + public static class MyType { + @SpecialString public String name; + } + + public static class SpecialStringUnmarshaller implements + StringParameterUnmarshaller { + + @Context + private Injected in; + + @Override + public void setAnnotations(Annotation[] annotations) { + } + + @Override + public String fromString(String str) { + return in.value; + } + + } + + public static class Injected { + + private final String value; + + public Injected(String value) { + this.value = value; + } + + } + + @Retention(RetentionPolicy.RUNTIME) + @StringParameterUnmarshallerBinder(SpecialStringUnmarshaller.class) + public static @interface SpecialString { + } +} Index: resteasy-jaxrs/src/main/java/org/jboss/resteasy/core/StringParameterInjector.java =================================================================== --- resteasy-jaxrs/src/main/java/org/jboss/resteasy/core/StringParameterInjector.java (revision 1415) +++ resteasy-jaxrs/src/main/java/org/jboss/resteasy/core/StringParameterInjector.java (working copy) @@ -125,6 +125,7 @@ { throw new RuntimeException(e); } + factory.injectProperties(unmarshaller); unmarshaller.setAnnotations(annotations); return; }