自定义springmvc json视图解析处理 完整攻略:
在使用Spring MVC进行web开发时,返回json视图是非常常见的操作。默认的情况下,Spring MVC使用Jackson库将对象转换为json格式的数据,并返回给前端。但是,在一些特殊的应用场景中,我们需要使用自定义的json视图。比如,我们需要将实体类中的某些属性剔除掉,或者需要对某些属性进行格式化,此时就需要自定义json视图。
实现自定义json视图的思路就是:
- 创建一个自定义的json视图类,继承AbstractView类,并重写里面的renderMergedOutputModel方法,将model中的数据转换成json格式的数据,并写入HttpServletResponse对象中。
- 在controller中,将方法的返回值设置为我们自定义的json视图类的实例。
- 在方法中设置需要返回给前端的数据。
二、具体实现步骤
接下来我将分别说明自定义json视图的具体实现步骤。
1. 创建自定义视图类
创建一个实现了AbstractView类的自定义视图类,代码示例如下:
public class CustomJsonView extends AbstractView {
public static final String CONTENT_TYPE = "application/json";
private ObjectMapper objectMapper;
public CustomJsonView() {
super.setContentType(CONTENT_TYPE);
objectMapper = new ObjectMapper();
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setContentType(CONTENT_TYPE);
response.setCharacterEncoding("UTF-8");
OutputStream outputStream = response.getOutputStream();
objectMapper.writeValue(outputStream, model);
outputStream.flush();
}
}
说明:
- 自定义视图类必须继承AbstractView类。
- 在构造方法中设置Content-Type为application/json,这样可以使浏览器知道返回的是json格式的数据。
- 在renderMergedOutputModel方法中,先设置响应的Content-Type和字符编码,然后通过ObjectMapper将model中的数据转换成json格式的数据,并写入到HttpServletResponse对象的输出流中。
2. 定义Controller
在Controller中定义一个方法,返回我们自定义的json视图类的实例。这里使用了@GetMapping
注解,表示该方法只接收GET请求。
@RestController
public class PersonController {
@GetMapping("/person/{id}")
public ModelAndView getPersonById(@PathVariable("id") int id) {
Person person = new Person(id, "张三", "zhangsan@example.com");
Map<String, Object> model = new HashMap<>();
model.put("person", person);
return new ModelAndView(new CustomJsonView(), model);
}
}
说明:
- Controller需要添加
@RestController
注解,表示该类是一个Spring MVC的Controller,并且返回的数据将以json格式返回。 - 在getPersonById方法中,构造一个Person对象,并将其作为model参数传入到CustomJsonView的实例中。
3. 测试
现在可以启动应用程序,并访问http://localhost:8080/person/1
,可以看到返回的结果是json格式的数据,如下所示:
{
"person": {
"id": 1,
"name": "张三",
"email": "zhangsan@example.com"
}
}
这就是我们自定义的json视图。
三、更多示例
除了上面的示例,我们还可以根据实际业务需求进行自定义json视图。下面介绍两个自定义json视图的示例。
示例一:剔除实体类中的某些属性
如果我们需要剔除实体类中的某些属性,可以写一个自定义视图类,继承JacksonJsonView类(它已经处理了json格式的对象转换),并重写里面的writeContent方法,通过反射的方式修改对象中的属性,然后再调用父类的writeContent方法,将修改后的对象转成json格式的数据。
代码示例如下:
public class CustomJacksonJsonView extends MappingJackson2JsonView {
@Override
protected void writeContent(Object object, HttpServletResponse response) throws IOException {
if (object instanceof Map) {
Map map = (Map) object;
// 剔除password属性
map.remove("password");
} else if (object instanceof User) {
User user = (User) object;
// 剔除password属性
user.setPassword(null);
}
super.writeContent(object, response);
}
}
示例二:对实体类中的某些属性进行格式化
如果我们需要对实体类中的某些属性进行格式化,比如从Date类型格式化成指定格式的字符串,可以写一个自定义的ObjectMapper,然后在自定义视图类中设置这个ObjectMapper即可。
代码示例如下:
public class CustomObjectMapper extends ObjectMapper {
public CustomObjectMapper() {
super();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
super.setDateFormat(sdf);
}
}
public class CustomJsonView extends AbstractView {
public static final String CONTENT_TYPE = "application/json";
private ObjectMapper objectMapper;
public CustomJsonView() {
super.setContentType(CONTENT_TYPE);
objectMapper = new CustomObjectMapper();
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) throws Exception {
// 省略和上面相同的代码
objectMapper.writeValue(outputStream, model);
outputStream.flush();
}
}
四、总结
通过本文的介绍,我们可以知道自定义视图的实现思路,以及两个自定义视图的示例:剔除实体类中的某些属性和对实体类中的某些属性进行格式化。了解了自定义视图的实现思路和使用场景,可以让我们更好地掌握Spring MVC框架的使用,并满足项目需求的实现。