您的位置:首页 > 编程语言 > Java开发

Spring 4 Spring MVC 4 REST + Jackson @JsonView集成实例详解

2016-11-19 23:34 681 查看
分享一个使用SpringMVC4 Rest 和Jackson的@JsonView注解集成的实例。@JsonView用来过滤JSON响应。Spring4.1开始直接支持
@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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: