Skip to content

Commit

Permalink
jackson增加使用Jaxb Annotation的演示
Browse files Browse the repository at this point in the history
  • Loading branch information
calvin1978 committed May 2, 2012
1 parent fc1da77 commit 40b87d2
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 7 deletions.
Expand Up @@ -9,6 +9,10 @@
import java.util.Map;
import java.util.Map.Entry;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.junit.Test;
Expand Down Expand Up @@ -137,8 +141,8 @@ public void threeTypeInclusion() {
assertEquals("{\"name\":\"A\",\"defaultValue\":\"hello\",\"nullValue\":null}", normalMapper.toJson(bean));

//不打印nullValue属性
JsonMapper nonNullMapper = JsonMapper.nonEmptyMapper();
assertEquals("{\"name\":\"A\",\"defaultValue\":\"hello\"}", nonNullMapper.toJson(bean));
JsonMapper nonEmptyMapper = JsonMapper.nonEmptyMapper();
assertEquals("{\"name\":\"A\",\"defaultValue\":\"hello\"}", nonEmptyMapper.toJson(bean));

//不打印默认值未改变的nullValue与defaultValue属性
JsonMapper nonDefaultMaper = JsonMapper.nonDefaultMapper();
Expand All @@ -149,12 +153,24 @@ public void threeTypeInclusion() {
* 测试类似Jaxb的常用annotaion,如properName,ignore,propertyOrder
*/
@Test
public void jaxbStyleAnnoation() {
public void jacksonAnnoation() {
TestBean2 testBean = new TestBean2(1, "foo", 18);
//结果name属性输出在前,且被改名为productName,且age属性被ignore
assertEquals("{\"productName\":\"foo\",\"id\":1}", mapper.toJson(testBean));
}

/*
* 测试直接使用Jaxb的annotaion
*/
@Test
public void jaxbAnnoation() {
JsonMapper newMapper = new JsonMapper();
newMapper.enableJaxbAnnotation();
TestBean3 testBean = new TestBean3(1, "foo", 18);
//结果name属性输出在前,且被改名为productName,且age属性被ignore
assertEquals("{\"productName\":\"foo\",\"id\":1}", newMapper.toJson(testBean));
}

//调转顺序
@JsonPropertyOrder({ "name", "id" })
public static class TestBean2 {
Expand All @@ -179,6 +195,30 @@ public TestBean2(long id, String name, int age) {

}

//调转顺序
@XmlType(propOrder = { "name", "id" })
public static class TestBean3 {

public long id;

@XmlElement(name = "productName")
public String name;

@XmlTransient
public int age;

public TestBean3() {

}

public TestBean3(long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}

}

/**
* 更新一個已存在Bean,JSON字符串裡只含有Bean的部分屬性,只覆蓋这部分的屬性.
*/
Expand Down
6 changes: 4 additions & 2 deletions modules/core/pom.xml
Expand Up @@ -13,7 +13,6 @@
<name>Springside :: Module :: Core</name>

<dependencies>

<!-- PERSISTENCE begin -->
<dependency>
<groupId>org.hibernate</groupId>
Expand Down Expand Up @@ -69,6 +68,10 @@
<artifactId>jackson-databind</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
</dependency>
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
Expand Down Expand Up @@ -98,7 +101,6 @@
<artifactId>jcl-over-slf4j</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
Expand Down
Expand Up @@ -18,6 +18,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;

/**
* 简单封装Jackson,实现JSON String<->Java Object的Mapper.
Expand All @@ -33,13 +34,15 @@ public class JsonMapper {
private ObjectMapper mapper;

public JsonMapper() {
this(Include.ALWAYS);
this(null);
}

public JsonMapper(Include include) {
mapper = new ObjectMapper();
//设置输出时包含属性的风格
mapper.setSerializationInclusion(include);
if (include != null) {
mapper.setSerializationInclusion(include);
}
//设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}
Expand Down Expand Up @@ -152,6 +155,15 @@ public void enableEnumUseToString() {
mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
}

/**
* 支持使用Jaxb的Annotation,使得POJO上的annotation不用与Jackson耦合。
* 默认会先查找jaxb的annotation,如果找不到再找jackson的。
*/
public void enableJaxbAnnotation() {
JaxbAnnotationModule module = new JaxbAnnotationModule();
mapper.registerModule(module);
}

/**
* 取出Mapper做进一步的设置或使用其他序列化API.
*/
Expand Down
5 changes: 5 additions & 0 deletions modules/extension/pom.xml
Expand Up @@ -48,6 +48,11 @@
<artifactId>slf4j-api</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
Expand Down
5 changes: 5 additions & 0 deletions pom.xml
Expand Up @@ -548,6 +548,11 @@
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
Expand Down

0 comments on commit 40b87d2

Please sign in to comment.