Spring mvc 精确 控制返回字段 SimpleFilterProvider,@JasonView,以及VO 视图模型的选择

使用 SimpleFilterProvider,PropertyFilter 好处在于 解耦,灵活.但是弊端也非常明显

先来看看@JsonView 的处理方式

在 WebMvcConfigurationSupport 中有一个配置方法,如果程序中有 com.fasterxml.jackson.databind.ObjectMapper && com.fasterxml.jackson.core.JsonGenerator 包的引用就会把实现了  RequestBodyAdvice 的 JsonViewRequestBodyAdvice 以及

实现了 ResponseBodyAdvice 的 JsonViewResponseBodyAdvice 添加进来
    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
        RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter();
        adapter.setContentNegotiationManager(mvcContentNegotiationManager());
        adapter.setMessageConverters(getMessageConverters());
        adapter.setWebBindingInitializer(getConfigurableWebBindingInitializer());
        adapter.setCustomArgumentResolvers(getArgumentResolvers());
        adapter.setCustomReturnValueHandlers(getReturnValueHandlers());

        if (jackson2Present) {
            adapter.setRequestBodyAdvice(Collections.singletonList(new JsonViewRequestBodyAdvice()));
            adapter.setResponseBodyAdvice(Collections.singletonList(new JsonViewResponseBodyAdvice()));
        }

        AsyncSupportConfigurer configurer = new AsyncSupportConfigurer();
        configureAsyncSupport(configurer);
        if (configurer.getTaskExecutor() != null) {
            adapter.setTaskExecutor(configurer.getTaskExecutor());
        }
        if (configurer.getTimeout() != null) {
            adapter.setAsyncRequestTimeout(configurer.getTimeout());
        }
        adapter.setCallableInterceptors(configurer.getCallableInterceptors());
        adapter.setDeferredResultInterceptors(configurer.getDeferredResultInterceptors());

        return adapter;
    }

最终处理的是,  RequestResponseBodyAdviceChain 这个责任链

使用 SimpleFilterProvider,PropertyFilter 自定义控制json返回值,会直接拿到request,强制修改请求头为Json,并输出,结束了此次的请求.就把责任链给中断了,所以在@RestController 中,会失效

使用@jsonView 比较符合Spring的设计模式,但是耦合性非常强,并且你会发现,如果你要返回Jpa 的page @JsonView 就没用了

还要对Page做以下包装

/**
 * @author laizhenwei
 * @date 2018/06/09
 */
@JsonView(View.class)
public class PageVo<T> extends PageImpl<T> implements Page<T> {

    private static final long serialVersionUID = -3530103094806749298L;

    public PageVo(final List<T> content, final Pageable pageable, final long total) {
        super(content, pageable, total);
    }

    public PageVo(final List<T> content) {
        super(content);
    }

    public PageVo(final Page<T> page, final Pageable pageable) {
        super(page.getContent(), pageable, page.getTotalElements());
    }

所以还是乖乖写VO 转换吧,反正都要浪费元空间

原文地址:https://www.cnblogs.com/sweetchildomine/p/9158861.html

时间: 2024-08-03 00:41:28

Spring mvc 精确 控制返回字段 SimpleFilterProvider,@JasonView,以及VO 视图模型的选择的相关文章

Spring MVC灵活控制返回json的值(自定义过滤字段)

在使用spring MVC开发过程中,为了提高项目执行效率,所以在一些外键字段的实体中会注解"@ManyToOne(fetch = FetchType.LAZY)"以实现延迟加载的效果. 但是,在使用ajax请求数据,当需要返回的序列化数据中包含延迟加载的属性时,会出现错误,延迟加载的属性无法进行序列化.在这个时候,我们需要暂时取消延迟加载,以取到所有需要的数据. 可是,这样又会造成一堆垃圾数据的产生.序列化.传递至前台. 所以需要在控制层进行数据过滤,只序列化需要的数据. 具体过滤方

spring MVC 权限控制拦截

SecurityInterceptor实现spring mvc 框架的结构在访问控制@Controller之前的权限拦截,具体实现方法,增加总权限控制器 public class SecurityInterceptor extends HandlerInterceptorAdapter{ private static final Logger logger = Logger.getLogger(SecurityInterceptor.class); @Resource private Sessi

判断JSON是否为空 (用spring mvc @ResponseBody 自动返回的json串 )

判断JSON是否为空 (用spring mvc @ResponseBody 自动返回的json串 ) 知识分类:EXTJS  spring mvc json 记录时间: 20150708 简单描述:用json.length 属性长度来判断是否为空,在此过程中spring mvc 自动返回的json串是 字符串的类型,所以用.length的方式返回的则是字符串的长度(一般空的JSON 在此处返回的长度应为3),并不是数组的长度,在EXTJS中用Ext.decode(json); 则可以将字符串js

Spring MVC @ResponseBody注解返回值中文乱码问题

在Spring MVC 的Controller中使用@ResponseBody注解向客户端返回数据时,如果没有特殊设置则中文将显示为乱码,此时需要在Spring-MVC.xml配置文件中加入如下代码 <!-- 避免IE在ajax请求时,返回json出现下载 --> <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHt

Spring MVC使用@ResponseBody返回JSON数据406问题解决方案

其实前面一篇关于zTree返回JSON数据的文章已经有一种解决方案了,但是当我今天在新公司搭建新环境的时候,发现决然又不行了,所以我觉得那应该不是最优的解决方案. 说起来,我以前接触到的一个项目,根本没有配置spring的文件,就直接用@ResponseBody可以返回JSON数据,不知道其中的秘诀在什么地方,搞不懂了. 今天主要提供另一个解决@ResponseBody返回JSON数据,页面抛出406错误的解决方案. 第一步,引入包: <dependency> <groupId>c

Spring MVC 中请求返回之后的页面没法加载css、js等静态文件

1.是否被拦截,这个在Web.xml配置中servlet拦截是“/”,如果是则 a.使用spring MVC 的静态资源文件 <!-- 静态文件访问,主要是针对DispatcherServlet的拦截是/的--> <mvc:annotation-driven /> <mvc:resources location="/image/" mapping="/image/**"/> <mvc:resources location=&

Spring mvc请求处理流程详解(一)之视图解析

前言 Spring mvc框架相信很多人都很熟悉了,关于这方面的资料也是一搜一大把.但是感觉讲的都不是很细致,让很多初学者都云里雾里的.本人也是这样,之前研究过,但是后面一段时间不用发现又忘记了.所以决定写下来,以备后用. 本系列文基于spring-4.3.1,配置方式全部基于java-based方式 从配置讲起 先上一段配置的代码: @EnableWebMvc @Configuration public class MvcConfig extends WebMvcConfigurerAdapt

Spring mvc配置Json返回

第一种 配置 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" > <property name="ignoreDefaultModelOnRedirect" value="true" /> <property name="messageConverters&quo

玩转Spring MVC (一)---控制反转(依赖注入)

Spring的核心是控制反转,什么是控制反转呢?小编浅述一下自己的拙见,有不当之处还希望大家指出. 控制反转(IOC),也可以叫做依赖注入(DI),这两个词其实是一个概念. 控制反转,那是什么控制被反转了呢?Martin Fowler总结出是"依赖对象的获得"被反转了. 什么是"依赖对象"呢?大多数情况下,java中的都需要通过多个类的合作实现某种业务逻辑,每个对象都需要与他合作的对象的引用,这个与他合作的对象就是它的"依赖对象". 如果我们要引