blob: 3e37a1390d6fc05e28a22e6e4598c3fdf48d9748 [file] [log] [blame]
package org.codehaus.jackson.jaxb;
import java.io.*;
import java.math.BigDecimal;
import java.util.Map;
import javax.xml.bind.annotation.*;
import org.codehaus.jackson.map.*;
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
/**
* Tests for verifying auto-detection settings with JAXB annotations.
*
* @author Tatu Saloranta
*/
public class TestJaxbAutoDetect
extends org.codehaus.jackson.map.BaseMapTest
{
/*
/**********************************************************
/* Helper beans
/**********************************************************
*/
/* Bean for testing problem [JACKSON-183]: with normal
* auto-detect enabled, 2 fields visible; if disabled, just 1.
* NOTE: should NOT include "XmlAccessorType", since it will
* have priority over global defaults
*/
static class Jackson183Bean {
public String getA() { return "a"; }
@XmlElement public String getB() { return "b"; }
// JAXB (or Bean introspection) mandates use of matching setters...
public void setA(String str) { }
public void setB(String str) { }
}
static class Identified
{
Object id;
@XmlAttribute(name="id")
public Object getIdObject() {
return id;
}
public void setId(Object id) { this.id = id; }
}
@XmlRootElement(name="bah")
public static class JaxbAnnotatedObject {
private BigDecimal number;
public JaxbAnnotatedObject() { }
public JaxbAnnotatedObject(String number) {
this.number = new BigDecimal(number);
}
@XmlElement
public void setNumber(BigDecimal number) {
this.number = number;
}
@XmlTransient
public BigDecimal getNumber() {
return number;
}
@XmlElement(name = "number")
public BigDecimal getNumberString() {
return number;
}
}
public static class DualAnnotationObjectMapper extends ObjectMapper {
public DualAnnotationObjectMapper() {
super();
AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
// make de/serializer use JAXB annotations first, then jackson ones
AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
setAnnotationIntrospector(pair);
}
}
/*
/**********************************************************
/* Unit tests
/**********************************************************
*/
public void testAutoDetectDisable() throws IOException
{
ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector());
Jackson183Bean bean = new Jackson183Bean();
Map<String,Object> result;
// Ok: by default, should see 2 fields:
result = writeAndMap(mapper, bean);
assertEquals(2, result.size());
assertEquals("a", result.get("a"));
assertEquals("b", result.get("b"));
// But when disabling auto-detection, just one
mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector());
mapper.configure(SerializationConfig.Feature.AUTO_DETECT_GETTERS, false);
result = writeAndMap(mapper, bean);
assertEquals(1, result.size());
assertNull(result.get("a"));
assertEquals("b", result.get("b"));
}
// @since 1.5
public void testIssue246() throws IOException
{
ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector());
Identified id = new Identified();
id.id = "123";
assertEquals("{\"id\":\"123\"}", mapper.writeValueAsString(id));
}
// [JACKSON-556]
public void testJaxbAnnotatedObject() throws Exception
{
JaxbAnnotatedObject original = new JaxbAnnotatedObject("123");
ObjectMapper mapper = new DualAnnotationObjectMapper();
String json = mapper.writeValueAsString(original);
assertFalse("numberString field in JSON", json.contains("numberString")); // kinda hack-y :)
JaxbAnnotatedObject result = mapper.readValue(json, JaxbAnnotatedObject.class);
assertEquals(new BigDecimal("123"), result.number);
}
/*
public void testJaxbAnnotatedObjectXML() throws Exception
{
JAXBContext ctxt = JAXBContext.newInstance(JaxbAnnotatedObject.class);
JaxbAnnotatedObject original = new JaxbAnnotatedObject("123");
StringWriter sw = new StringWriter();
ctxt.createMarshaller().marshal(original, sw);
String xml = sw.toString();
JaxbAnnotatedObject result = (JaxbAnnotatedObject) ctxt.createUnmarshaller().unmarshal(new StringReader(xml));
assertEquals(new BigDecimal("123"), result.number);
}
*/
}