文档章节

Spring 转换 model 为 json 时增加属性

郁也风
 郁也风
发布于 09/23 18:28
字数 571
阅读 43
收藏 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
博文 25
码字总数 13007
作品 0
长宁
项目经理
私信 提问
spring MVC中传递的参数对象中包含list的情况!!!!!

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

yunlielai
06/10
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
Spring MVC返回json字符串时数据格式化

在运用Spring MVC框架开发时,可以直接在方法上添加注解 @ResponseBody 返回JSON数据,如果javabean的属性中包含Date日期类型的数据,默认的转换格式并不是我们想要的 yyyy-MM-dd 这样的格式...

云颖
2014/01/22
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

没有更多内容

加载失败,请刷新页面

加载更多

IOC的学习(1)

1.IOC理论概要 java中,一个对象A怎么才能调用对象B? 当一个对象的构建,需要多个其他对象时,对象和对象有复杂的构建关系。spring帮助我们维系对象的依赖关系,降低系统的实现成本,前提是...

杨健-YJ
19分钟前
1
0
Spring 的 getBean 方法源码解析

文本将从以下几个方面介绍 相关文章 FactoryBean 接口 BeanFactory 接口 BeanFactory 接口 和 FactoryBean 接口的区别 getBean 方法的源码解析 Spring 循环依赖的解决方式 相关文章 Spring 中...

TSMYK
22分钟前
0
0
李鸿章六百多字参倒豪门重臣,晚清第一奏折,藏尽顶级权谋话术!

道光二十七年(1847年),二十四岁的李鸿章高中进士,列二甲第十三名。 在此期间,有桩轶事挺有意思。 会试时,李鸿章的房师为当时的名士孙锵鸣。发榜后,孙锵鸣见自己这一房只考中了李鸿章、...

乔老哥
28分钟前
1
0
PTA-基础编程题目集-7-14 求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。 输入格式: 输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。 输出格式: 首先顺序输出从A到B的所有整数,每...

niithub
28分钟前
3
0
Spring Qualifier的使用

摘要 spring 的 qualifier 平常使用一般直接是使用id 来限定,不过spring给我们提供了更强大的功能。 使用方法 直接使用 直接在@Qualifier中限定bean的id 在bean上使用@Qualifier来指定后续使...

52iSilence7
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部