BeanDeserializerModifier4216Test.java
package com.fasterxml.jackson.databind.deser;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import com.fasterxml.jackson.databind.type.ArrayType;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* Unit test for [databind#4216] : Primitive array deserializer cannot being captured by DeserializerModifier
*/
public class BeanDeserializerModifier4216Test extends DatabindTestUtil
{
static class WrapperBean4216 {
public Byte[] objArr;
public byte[] primArr;
}
@Test
public void testModifierCalledTwice() throws Exception
{
// Given : Configure and construct
AtomicInteger counter = new AtomicInteger(0);
ObjectMapper objectMapper = jsonMapperBuilder()
.addModules(getSimpleModuleWithCounter(counter))
.build();
// Given : Set-up data
WrapperBean4216 test = new WrapperBean4216();
test.primArr = new byte[]{(byte) 0x11};
test.objArr = new Byte[]{(byte) 0x11};
String sample = objectMapper.writeValueAsString(test);
// When
objectMapper.readValue(sample, WrapperBean4216.class);
// Then : modifyArrayDeserializer should be called twice
assertEquals(2, counter.get());
}
private static SimpleModule getSimpleModuleWithCounter(AtomicInteger counter) {
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(
new BeanDeserializerModifier() {
private static final long serialVersionUID = 1L;
@Override
public JsonDeserializer<?> modifyArrayDeserializer(DeserializationConfig config,
ArrayType valueType, BeanDescription beanDesc, JsonDeserializer<?> deserializer)
{
// Count invocations
counter.incrementAndGet();
return deserializer;
}
});
return module;
}
}