Spring 4 Spring MVC 4 REST + Jackson @JsonView集成实例详解
2016-11-19 23:34
681 查看
分享一个使用SpringMVC4 Rest 和Jackson的@JsonView注解集成的实例。@JsonView用来过滤JSON响应。Spring4.1开始直接支持
Java8以上
Spring 4.2.6.RELEASE
Jackson 2.6.6
Tomcat 8以上
Maven
Eclipse
Profile.java:
Profile类中,我们正在为用户资料创建一个视图筛选器机制。我们创建了3个资料视图,PublicView、FriendsView 和FamilyView 。FriendsView 继承了PublicView,FamilyView 则继承了FriendsView 。
使用
Jackson 提供了
1.在我们的PublicView中,只有
2.在FriendsView 中,只有
3.在FamilyView 中,
Address.java:
College.java:
User.java:
Name.java:
1.在实例的Controller中,使用
2.使用
FriendsView属性的JSON响应。
3.使用
FriendsView和FamilyView属性的JSON响应。
4.
UserController.java:
UserService.java:
AppConfig.java:
Application的初始化配置。
WebAppInitializer.java:
测试
测试
测试
@JsonView注解。要使用
@JsonView,首先我们需要定义视图,我们可以定义多个视图。一个视图定义可以继承其他视图定义。我们的POJO使用
@JsonView注解属性传递已经定义的视图。在Spring的Controller我们可以使用Jackson的
@JsonView注解我们的方法。序列化Http响应体的时候,JSON响应将在配置视图的基础上进行过滤。我们也可以在Spring REST Client使用
@JsonView注解。Spring提供了
MappingJacksonValue包装POJO和序列化视图设置,在发送到web服务器短的时候,我们可以使用
RestTemplate来过滤JSON。现在一步一步呈现完整的示例。
准备条件
(本文章分享在CSDN平台,更多精彩请阅读 东陆之滇的csdn博客:http://blog.csdn.net/zixiao217 ,如在其他平台看到此文可能会出现内容不完整的现象,请移至东陆之滇http://blog.csdn.NET/zixiao217查看原文)Java8以上
Spring 4.2.6.RELEASE
Jackson 2.6.6
Tomcat 8以上
Maven
Eclipse
项目结构视图
Maven的pom.xml文件
pom.xml:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.byron4j</groupId> <artifactId>springMVC4-rest-jackson-jsonview-annotation</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>war</packaging> <name>springMVC4-rest-jackson-jsonview-annotation</name> <url>http://blog.csdn.net/zixiao217/article</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.framework.version>4.2.6.RELEASE</spring.framework.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.framework.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.6</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> </dependencies> <build> <finalName>springMvc4-rest</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
创建JSON视图的定义
该对象可以在序列化Http响应时通过@JsonView来过滤。第一步使用
@JsonView,我们需要创建JSON视图定义。我们需要创建接口或静态类。对于一个以上的视图,我们可以创建一个以上的接口。最好是创建组合接口。在一个类里面创建多个接口以应对多个序列化Http响应的视图。要继承一个视图,我们可以使用另一个接口来继承。
Profile.java:
package org.byron4j.springMVC4_rest_jackson_jsonview_annotation; public class Profile { public interface PublicView {} public interface FriendsView extends PublicView{} public interface FamilyView extends FriendsView {} }
Profile类中,我们正在为用户资料创建一个视图筛选器机制。我们创建了3个资料视图,PublicView、FriendsView 和FamilyView 。FriendsView 继承了PublicView,FamilyView 则继承了FriendsView 。
使用@JsonView
注解创建POJO
Jackson 提供了com.fasterxml.jackson.annotation.JsonView注解属性,该属性将会在序列化Http响应的时候包含进去。
1.在我们的PublicView中,只有
@JsonView(Profile.PublicView.class)注解的属性才会过滤。
2.在FriendsView 中,只有
@JsonView(Profile.PublicView.class)和
@JsonView(Profile.FriendsView.class)注解的属性才会过滤。
3.在FamilyView 中,
@JsonView(Profile.PublicView.class)、
@JsonView(Profile.FriendsView.class)和
@JsonView(Profile.FamilyView .class)注解的属性均会过滤。
Address.java:
package org.byron4j.springMVC4_rest_jackson_jsonview_annotation.pojo; import org.byron4j.springMVC4_rest_jackson_jsonview_annotation.Profile; import com.fasterxml.jackson.annotation.JsonView; public class Address { @JsonView(Profile.FamilyView.class) private String houseNo; @JsonView(Profile.FriendsView.class) private String city; @JsonView(Profile.PublicView.class) private String country; public Address(String houseNo, String city, String country) { this.houseNo = houseNo; this.city = city; this.country = country; } public String getHouseNo() { return houseNo; } public void setHouseNo(String houseNo) { this.houseNo = houseNo; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } }
College.java:
package org.byron4j.springMVC4_rest_jackson_jsonview_annotation.pojo; import org.byron4j.springMVC4_rest_jackson_jsonview_annotation.Profile; import com.fasterxml.jackson.annotation.JsonView; public class College { @JsonView(Profile.PublicView.class) private String colName; @JsonView(Profile.FriendsView.class) private String colLocation; public College(String colName, String colLocation) { this.colName = colName; this.colLocation = colLocation; } public String getColName() { return colName; } public void setColName(String colName) { this.colName = colName; } public String getColLocation() { return colLocation; } public void setColLocation(String colLocation) { this.colLocation = colLocation; } }
User.java:
package org.byron4j.springMVC4_rest_jackson_jsonview_annotation.pojo; import org.byron4j.springMVC4_rest_jackson_jsonview_annotation.Profile; import com.fasterxml.jackson.annotation.JsonView; public class User { @JsonView(Profile.PublicView.class) private String userId; private String password; private int age; @JsonView(Profile.FamilyView.class) private long mobnum; @JsonView(Profile.FriendsView.class) private String mailId; @JsonView(Profile.PublicView.class) private String name; @JsonView(Profile.PublicView.class) private College college; @JsonView(Profile.PublicView.class) private Address address; public User(String userId, String password, int age, long mobnum, String mailId, String name, College college, Address address) { this.userId = userId; this.password = password; this.age = age; this.mobnum = mobnum; this.mailId = mailId; this.name = name; this.college = college; this.address = address; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public long getMobnum() { return mobnum; } public void setMobnum(long mobnum) { this.mobnum = mobnum; } public String getMailId() { return mailId; } public void setMailId(String mailId) { this.mailId = mailId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public College getCollege() { return college; } public void setCollege(College college) { this.college = college; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
Name.java:
package org.byron4j.springMVC4_rest_jackson_jsonview_annotation.pojo; public class Name { private String firstName; private String middleName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
使用@JsonView注解创建SpringMVC Controller
Spring4.1以后直接支持Jackson的@JsonView注解。在序列化Http响应的时候,Controller中使用@RequestMapping注解的方法可以直接使用
@JsonView注解来过滤JSON视图。
1.在实例的Controller中,使用
@JsonView(Profile.PublicView.class)的方法将只产生PublicView属性的JSON响应。
2.使用
@JsonView(Profile.FriendsView.class)的方法将只产生PublicView、
FriendsView属性的JSON响应。
3.使用
@JsonView(Profile.FamilyView.class)的方法将会产生PublicView、
FriendsView和FamilyView属性的JSON响应。
4.
getCompleteProfileById()方法没有被任何试图注解,则会产生所有属性的JSON响应。
UserController.java:
package org.byron4j.springMVC4_rest_jackson_jsonview_annotation; import java.util.List; import org.byron4j.springMVC4_rest_jackson_jsonview_annotation.pojo.Name; import org.byron4j.springMVC4_rest_jackson_jsonview_annotation.pojo.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.annotation.JsonView; @RestController @RequestMapping("/app") public class UserController { @Autowired private UserService userService; @JsonView(Profile.PublicView.class) @RequestMapping(value= "/publicprofile", produces = MediaType.APPLICATION_JSON_VALUE) public List<User> getAllPublicProfile() { List<User> users = userService.getAllUsers(); return users; } @JsonView(Profile.FriendsView.class) @RequestMapping(value= "/friendsprofile", produces = MediaType.APPLICATION_JSON_VALUE) public List<User> getAllFriendsProfile() { List<User> users = userService.getAllUsers(); return users; } @JsonView(Profile.FamilyView.class) @RequestMapping(value= "/familyprofile", produces = MediaType.APPLICATION_JSON_VALUE) public List<User> getAllFamilyProfile() { List<User> users = userService.getAllUsers(); return users; } @RequestMapping(value= "/completeprofile/{userId}", produces = MediaType.APPLICATION_JSON_VALUE) public User getCompleteProfileById(@PathVariable(value = "userId") String userId) { User user = userService.getUserById(userId); return user; } @RequestMapping(value="/save", method = RequestMethod.POST) public ResponseEntity<String> save(@RequestBody Name name) { StringBuffer output = new StringBuffer(); if (name.getFirstName() != null) { output.append(" ").append(name.getFirstName()); } if (name.getMiddleName() != null) { output.append(" ").append(name.getMiddleName()); } if (name.getLastName() != null) { output.append(" ").append(name.getLastName()); } return new ResponseEntity<String>(output.toString(), HttpStatus.CREATED); } }
UserService.java:
package org.byron4j.springMVC4_rest_jackson_jsonview_annotation; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; import org.byron4j.springMVC4_rest_jackson_jsonview_annotation.pojo.Address; import org.byron4j.springMVC4_rest_jackson_jsonview_annotation.pojo.College; import org.byron4j.springMVC4_rest_jackson_jsonview_annotation.pojo.User; import org.springframework.stereotype.Service; @Service public class UserService { public User getUserById(String userId) { Predicate<User> userPredicate = u-> u.getUserId().equals(userId); User obj = list.stream().filter(userPredicate).findFirst().get(); return obj; } public List<User> getAllUsers() { return list; } private List<User> list = new ArrayList<>(); { Address address = new Address("A-32", "Varanasi", "India"); College college = new College("UP College", "Varanasi"); User user = new User("mohan", "m123", 20, 988745 ,"mohan@gmail.com", "Mohan", college, address); list.add(user); address = new Address("C-50", "Allahabad", "India"); college = new College("Allahabad University", "Allahabad"); user = new User("krishna", "k123", 25, 988345, "krishna@gmail.com", "Krishna", college, address); list.add(user); address = new Address("D-40", "Delhi", "India"); college = new College("JNU", "Delhi"); user = new User("mahesh", "mh123", 30, 988765, "mahesh@gmail.com", "Mahesh", college, address); list.add(user); } }
Java配置和应用程序初始化
包扫描的Java配置。AppConfig.java:
package org.byron4j.springMVC4_rest_jackson_jsonview_annotation.config; import java.util.List; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @ComponentScan("org.byron4j.springMVC4_rest_jackson_jsonview_annotation") @EnableWebMvc public class AppConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); builder.indentOutput(true); converters.add(new MappingJackson2HttpMessageConverter(builder.build())); } }
Application的初始化配置。
WebAppInitializer.java:
package org.byron4j.springMVC4_rest_jackson_jsonview_annotation.config; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[] { AppConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return null; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
运行服务程序
测试@JsonView(Profile.PublicView.class),使用http://localhost:8080/springMvc4-rest/app/publicprofile,得到的JSON响应:
[ { "userId" : "mohan", "name" : "Mohan", "college" : { "colName" : "UP College" }, "address" : { "country" : "India" } }, { "userId" : "krishna", "name" : "Krishna", "college" : { "colName" : "Allahabad University" }, "address" : { "country" : "India" } }, { "userId" : "mahesh", "name" : "Mahesh", "college" : { "colName" : "JNU" }, "address" : { "country" : "India" } } ]
测试
@JsonView(Profile.FriendsView.class),使用http://localhost:8080/springMvc4-rest/app/friendsprofile,得到的JSON响应:
[ { "userId" : "mohan", "mailId" : "mohan@gmail.com", "name" : "Mohan", "college" : { "colName" : "UP College", "colLocation" : "Varanasi" }, "address" : { "city" : "Varanasi", "country" : "India" } }, { "userId" : "krishna", "mailId" : "krishna@gmail.com", "name" : "Krishna", "college" : { "colName" : "Allahabad University", "colLocation" : "Allahabad" }, "address" : { "city" : "Allahabad", "country" : "India" } }, { "userId" : "mahesh", "mailId" : "mahesh@gmail.com", "name" : "Mahesh", "college" : { "colName" : "JNU", "colLocation" : "Delhi" }, "address" : { "city" : "Delhi", "country" : "India" } } ]
测试
@JsonView(Profile.FamilyView.class),使用http://localhost:8080/springMvc4-rest/app/friendsprofile,得到的JSON响应:
[ { "userId" : "mohan", "mobnum" : 988745, "mailId" : "mohan@gmail.com", "name" : "Mohan", "college" : { "colName" : "UP College", "colLocation" : "Varanasi" }, "address" : { "houseNo" : "A-32", "city" : "Varanasi", "country" : "India" } }, { "userId" : "krishna", "mobnum" : 988345, "mailId" : "krishna@gmail.com", "name" : "Krishna", "college" : { "colName" : "Allahabad University", "colLocation" : "Allahabad" }, "address" : { "houseNo" : "C-50", "city" : "Allahabad", "country" : "India" } }, { "userId" : "mahesh", "mobnum" : 988765, "mailId" : "mahesh@gmail.com", "name" : "Mahesh", "college" : { "colName" : "JNU", "colLocation" : "Delhi" }, "address" : { "houseNo" : "D-40", "city" : "Delhi", "country" : "India" } } ]
测试
getCompleteProfileById()方法,使用http://localhost:8080/springMvc4-rest/app/friendsprofile,得到的JSON响应:
{ "userId" : "krishna", "password" : "k123", "age" : 25, "mobnum" : 988345, "mailId" : "krishna@gmail.com", "name" : "Krishna", "college" : { "colName" : "Allahabad University", "colLocation" : "Allahabad" }, "address" : { "houseNo" : "C-50", "city" : "Allahabad", "country" : "India" } }
下载完整的源代码
戳这里下载项目springMVC4-rest-jackson-jsonview-annotation.zip相关文章推荐
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(一)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(四)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(一)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(四)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(四)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(一)
- Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(四)