文档章节

Spring 转换 model 为 json 时增加属性

郁也风
 郁也风
发布于 09/23 18:28
字数 571
阅读 12
收藏 0

缘起

目前的项目中有个需求是在附件对象转换成 json 时增加个 url 属性,以前的方式是在返回附件对象或列表时候做一次统一处理,这次想看看 spring 或者 jackson fasterxml 是否自带类似功能,结果一查,还真有。

当前业务系统的处理附件的方式是上传附件之后将其基本信息统一存储到附件表中,然后通过相应的 url 拼接附件 id 的方式来读取相应附件(以便更方便控制授权),也就是说将附件对象返回前端的时候需要将其 url 也放置到 json 中,但是这个 url 属性并不在基本信息中存在。

实现

查了一下,发现 @JsonAppend 完全可以满足这个需要。

@JsonAppend 在 jackson fasterxml 中是通过 VirtualBeanPropertyWriter 来处理的。

首先构造一个 mixin 接口,在其上配置 @JsonAppend:

@JsonAppend(
    props = {
        @JsonAppend.Prop(name = "url", value = AttachmentUrl.class),
    }
)
public interface AttachmentMixin {
}

之后就是实现 VirtualBeanPropertyWriter 的子类,在这儿可以通过 @Autowired 注入相应的处理方法:

public class AttachmentUrl extends VirtualBeanPropertyWriter {

    private static final long serialVersionUID = 1028128817195205673L;

    @Autowired UrlService urlService;

    public AttachmentUrl() {
    }

    public AttachmentUrl(BeanPropertyDefinition propDef,
        Annotations contextAnnotations,
        JavaType declaredType, UrlService urlService) {
        super(propDef, contextAnnotations, declaredType);

        this.urlService = urlService;
    }

    @Override
    protected Object value(Object bean, JsonGenerator gen, SerializerProvider prov) {

        if (urlService != null) {
            return urlService.getAttachUrl((Attachment) bean);
        }
        return null;
    }

    @Override
    public VirtualBeanPropertyWriter withConfig(MapperConfig<?> config,
        AnnotatedClass declaringClass, BeanPropertyDefinition propDef, JavaType type) {
        return new AttachmentUrl(propDef, null, type, urlService);
    }
}

注意:在 withConfig 方法中会创建新的对象,这个对象 return new AttachmentUrl(propDef, null, type, urlService);,这儿的 urlService不能使用 this.urlService, 因为urlService 是 spring 通过默认构造函数注入的,如果使用 this,则会成为 null。

最后配置 Jackson2ObjectMapperBuilderCustomizer

@Configuration
public class JacksonConfiguration {

    /**
     * 自定义 {@link Jackson2ObjectMapperBuilder}.
     *
     * @return 略
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer objectMapperBuilderCustomizer() {
        return builder -> builder.mixIn(Attachment.class, AttachmentMixin.class);
    }
}

原理

spring 通过 org.springframework.http.converter.json.SpringHandlerInstantiator 实现对于 jackson fasterxml 的配置,也就是说在此处注入相应的 bean,对于 @JsonAppend 的处理方法为:

@Override
	public VirtualBeanPropertyWriter virtualPropertyWriterInstance(MapperConfig<?> config, Class<?> implClass) {
		return (VirtualBeanPropertyWriter) this.beanFactory.createBean(implClass);
	}

Over

© 著作权归作者所有

共有 人打赏支持
郁也风
粉丝 16
博文 22
码字总数 11919
作品 0
长宁
项目经理
spring MVC中传递的参数对象中包含list的情况!!!!!

测试需要的jar包:spring 3.2.jar + jackson-all-1.8.5.jar。 写代码时碰到个需要将对象里的子明细一起传递到controller里去,当时就想直接将参数一起传递过来,贴下代码: controller: @Req...

yunlielai
06/10
0
0
SpringMVC请求参数接收总结

前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结。SpringMVC中处理控制器参数的接口是HandlerMethodArgumentResolver,此接口有众多子...

throwable
08/07
0
0
Spring3 MVC Restful 多请求类型(json,xml,k-v),多视图配置(J...

beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="ht......

李长春
2011/09/15
0
0
Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点

Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点的 json 报文 问题 问题描述起来比较拗口,其实就是用Spring MVC时,如何将对象映射成 json 报文时不把对象作为json的...

Tek_Eternal
2015/03/01
0
1
一文读懂SpringMVC中的数据绑定

Struts2 和 SpringMVC 都是 Web 开发中视图层的框架,两者都实现了数据的自动绑定,都不需要我们手动获取参数然后关联到对应的属性上,下面就谈谈两者的区别。 Spring MVC 是基于方法的,通过...

Java高级技术
09/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Go interface{} to string

package mainimport "fmt"func main() {var a interface{}a = "dsadjaldaldad"var b stringb = a.(string) // 话说,用人话说的话,这叫什么操作?fmt.Println(a, b)}...

taadis
14分钟前
0
0
数据库防火墙

数据库防火墙顾名思义是一款数据(库)安全设备,从防火墙这个词可以看出,其主要作用是做来自于外部的危险隔离。换句话说,数据库防火墙应该在入侵在到达数据库之前将其阻断,至少需要在入侵...

突突突酱
24分钟前
1
0
RDBMS 关系型数据库与 NoSQL 全面比较

随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求,主要体现在下面这四个方面: 低延迟的读写速度:应用快速地反应能极大地提升用户的满...

PeakFang-BOK
32分钟前
1
0
徒弟做了一个Python的实战小项目——银行系统

国际惯例:实践是检验真理的唯一标准。 众所周知,在编程过程中理论知识再充实也需要通过项目的炼金石。下面给大家看一下我徒弟做的一个小项目实战要求,是做一个银行系统,就是我们去银行办...

无也Python
39分钟前
2
0
vue.js响应式原理解析与实现

从很久之前就已经接触过了angularjs了,当时就已经了解到,angularjs是通过脏检查来实现数据监测以及页面更新渲染。之后,再接触了vue.js,当时也一度很好奇vue.js是如何监测数据更新并且重新...

peakedness丶
58分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部