package com.fasterxml.jackson.databind.contextual;
import java.io.IOException;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.fasterxml.jackson.annotation.JacksonAnnotation;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
public class TestContextualWithAnnDeserializer extends BaseMapTest
{
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface Name {
public String value();
}
static class StringValue {
protected String value;
public StringValue(String v) { value = v; }
}
static class AnnotatedContextualClassBean
{
@Name("xyz")
@JsonDeserialize(using=AnnotatedContextualDeserializer.class)
public StringValue value;
}
static class AnnotatedContextualDeserializer
extends JsonDeserializer<StringValue>
implements ContextualDeserializer
{
protected final String _fieldName;
public AnnotatedContextualDeserializer() { this(""); }
public AnnotatedContextualDeserializer(String fieldName) {
_fieldName = fieldName;
}
@Override
public StringValue deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
{
return new StringValue(""+_fieldName+"="+p.getText());
}
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
BeanProperty property)
throws JsonMappingException
{
Name ann = property.getAnnotation(Name.class);
if (ann == null) {
ann = property.getContextAnnotation(Name.class);
}
String propertyName = (ann == null) ? "UNKNOWN" : ann.value();
return new AnnotatedContextualDeserializer(propertyName);
}
}
// ensure that direct associations also work
public void testAnnotatedContextual() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
AnnotatedContextualClassBean bean = mapper.readValue(
"{\"value\":\"a\"}",
AnnotatedContextualClassBean.class);
assertNotNull(bean);
assertEquals("xyz=a", bean.value.value);
}
}