最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot如何根據(jù)配置屏蔽接口返回字段

 更新時(shí)間:2024年08月09日 11:37:00   作者:warrah  
這篇文章主要介紹了springboot如何根據(jù)配置屏蔽接口返回字段問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

springboot根據(jù)配置屏蔽接口返回字段

很多時(shí)候就是為了偷懶,swagger可以屏蔽接口文檔中的字段,卻不能屏蔽真實(shí)返回的數(shù)據(jù),故而需要再controller返回的時(shí)候再做處理

參考了springboot2 jackson實(shí)現(xiàn)動(dòng)態(tài)返回類字段,做了一些改動(dòng)

經(jīng)驗(yàn)證對(duì)簡(jiǎn)單接口,還可以,稍微復(fù)雜的嵌套就不行,可以使用@JsonIgnore,路徑為

com.fasterxml.jackson.annotation.JsonIgnore
<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>

1.類的數(shù)據(jù)域

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class JsonFields {

    boolean include = true;

    String[] fields = {};

}

2.開(kāi)啟的注解

寫在controller的方法上

import java.lang.annotation.*;

@Target({ ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface JsonInclude {
    /**
     * 排除
     * @return
     */
    boolean include() default true;

    /**
     * 字段類型
     * @return
     */
    Class clazz();

    /**
     * 過(guò)濾的字段名
     * @return
     */
    String[] fields() default {};
}

3.json過(guò)濾器

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.BeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.PropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;

import java.util.HashMap;
import java.util.Map;

public class JsonFilter extends FilterProvider {

    /**
     * 對(duì)于規(guī)則我們采用 ThreadLocal 封裝,防止出現(xiàn)線程安全問(wèn)題
     */
    private static final ThreadLocal<Map<Class<?>, JsonFields>> include = new ThreadLocal<>();

    /**
     * 清空規(guī)則
     */
    public static void clear() {
        include.remove();
    }


    /**
     * 設(shè)置過(guò)濾規(guī)則
     * @param clazz 規(guī)則
     */
    public static void add(boolean isInclude, Class<?> clazz, String... fields) {
        Map<Class<?>, JsonFields> map = include.get();
        if (map == null) {
            map = new HashMap<>();
            include.set(map);
        }
        JsonFields jsonFields = new JsonFields(isInclude,fields);
        map.put(clazz, jsonFields);
    }

    /**
     * 重寫規(guī)律規(guī)則
     */
    @Override
    public PropertyFilter findPropertyFilter(Object filterId, Object valueToFilter) {
        return new SimpleBeanPropertyFilter() {
            @Override
            public void serializeAsField(
                    Object pojo,
                    JsonGenerator jg,
                    SerializerProvider sp,
                    PropertyWriter pw
            ) throws Exception {
                if (apply(pojo.getClass(), pw.getName())) {
                    pw.serializeAsField(pojo, jg, sp);
                } else if (!jg.canOmitFields()) {
                    pw.serializeAsOmittedField(pojo, jg, sp);
                }
            }
        };
    }

    @Deprecated
    @Override
    public BeanPropertyFilter findFilter(Object filterId) {
        throw new UnsupportedOperationException("不支持訪問(wèn)即將過(guò)期的過(guò)濾器");
    }

    /**
     * 判斷該字段是否需要,返回 true 序列化,返回 false 則過(guò)濾
     * @param type 實(shí)體類類型
     * @param name 字段名
     */
    public boolean apply(Class<?> type, String name) {
        Map<Class<?>, JsonFields> map = include.get();
        if (map == null) {
            return true;
        }
        JsonFields jsonFields = map.get(type);
        String[] fields = jsonFields.getFields();
        if (jsonFields.isInclude()){
            for (String field : fields) {
                if (field.equals(name)) {
                    return true;
                }
            }
            return false;
        } else{
            for (String field : fields) {
                if (field.equals(name)) {
                    return false;
                }
            }
            return true;
        }
    }
}

4.過(guò)濾器切面

JsonFilter.clear();解決多線程下面的并發(fā)的問(wèn)題

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Slf4j
@Component
@Aspect
public class JsonFilterAop {

    @Pointcut("@annotation(com.tt.framework.web.filter.JsonInclude)")
    public void controllerAspect(){}


    /**
     * (1)@annotation:用來(lái)攔截所有被某個(gè)注解修飾的方法
     * (2)@within:用來(lái)攔截所有被某個(gè)注解修飾的類
     * (3)within:用來(lái)指定掃描的包的范圍
     */
    @Before("controllerAspect()")
    public void doBefore(JoinPoint joinPoint) throws Throwable{
        JsonFilter.clear();
        //從切面織入點(diǎn)處通過(guò)反射機(jī)制獲取織入點(diǎn)處的方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        //獲取切入點(diǎn)所在的方法
        Method method = signature.getMethod();
        JsonInclude jsonInclude = method.getAnnotation(JsonInclude.class);
        JsonFilter.add(jsonInclude.include(),jsonInclude.clazz(),jsonInclude.fields());
    }


}

5.如何使用

啟動(dòng)類增加此過(guò)濾器

@Slf4j
@SpringBootApplication
public class FayServerApplication {

    public static void main(String[] args) {
        try {
            ConfigurableApplicationContext context = SpringApplication.run(FayServerApplication.class, args);
            ObjectMapper objectMapper = context.getBean(ObjectMapper.class);
            objectMapper.setFilterProvider(new JsonFilter());

        } finally {
            log.info("server start finish");
        }
    }
}

include = true包含則表示僅顯示包含的數(shù)據(jù),include = false則排除這配置的fields,顯示沒(méi)有配置的字段。

沒(méi)有此注解的則不受影響

 @JsonInclude(include = true,clazz = LxrJbhYsth.class,fields = {"dg","mz"})
    @ApiOperation("金不換規(guī)則")
    @GetMapping("jbhRule")
    public ResponseResult<List<LxrJbhYsth>> jbhRule(String dg){
        List<LxrJbhYsth> lxrJbhYsths = extLxrJbhYsthService.selectByDg(dg);
        ResponseResult<List<LxrJbhYsth>> resp = new ResponseResult<>(true);
        resp.setData(lxrJbhYsths);
        return resp;
    }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot配置文件、多環(huán)境配置、讀取配置的4種實(shí)現(xiàn)方式

    SpringBoot配置文件、多環(huán)境配置、讀取配置的4種實(shí)現(xiàn)方式

    SpringBoot支持多種配置文件位置和格式,其中application.properties和application.yml是默認(rèn)加載的文件,配置文件可以根據(jù)環(huán)境通過(guò)spring.profiles.active屬性進(jìn)行區(qū)分,命令行參數(shù)具有最高優(yōu)先級(jí),可覆蓋其他所有配置
    2024-09-09
  • Java I/O深入學(xué)習(xí)之File和RandomAccessFile

    Java I/O深入學(xué)習(xí)之File和RandomAccessFile

    這篇文章主要介紹了Java I/O深入學(xué)習(xí)之File和RandomAccessFile, I/O系統(tǒng)即輸入/輸出系統(tǒng),對(duì)于一門程序語(yǔ)言來(lái)說(shuō),創(chuàng)建一個(gè)好的輸入/輸出系統(tǒng)并非易事。在充分理解Java I/O系統(tǒng)以便正確地運(yùn)用之前,我們需要學(xué)習(xí)相當(dāng)數(shù)量的類。,需要的朋友可以參考下
    2019-06-06
  • Java實(shí)現(xiàn)拓?fù)渑判虻氖纠a

    Java實(shí)現(xiàn)拓?fù)渑判虻氖纠a

    這篇文章我們要講的是拓?fù)渑判?,這是一個(gè)針對(duì)有向無(wú)環(huán)圖的算法,主要是為了解決前驅(qū)后繼的關(guān)系,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • 解決表單post,get到springMVC后臺(tái)亂碼的問(wèn)題

    解決表單post,get到springMVC后臺(tái)亂碼的問(wèn)題

    下面小編就為大家分享一篇解決表單post,get到springMVC后臺(tái)亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • JavaGUI界面實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)方法

    JavaGUI界面實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)方法

    這篇文章主要給大家介紹了關(guān)于JavaGUI界面實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的相關(guān)資料, GUI是指圖形用戶界面,指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面,需要的朋友可以參考下
    2023-07-07
  • SpringBoot管理RabbitMQ中的Channel詳解

    SpringBoot管理RabbitMQ中的Channel詳解

    這篇文章主要介紹了SpringBoot管理RabbitMQ中的Channel詳解,channel僅存在于connection的上下文中,而不會(huì)單獨(dú)存在,當(dāng)channel關(guān)閉時(shí),其上的所有channel也會(huì)關(guān)閉,需要的朋友可以參考下
    2023-08-08
  • Springboot中前端向后端傳遞數(shù)據(jù)的幾種方式

    Springboot中前端向后端傳遞數(shù)據(jù)的幾種方式

    在前端和后端的交互中,前端需要向后端傳遞數(shù)據(jù),常見(jiàn)的數(shù)據(jù)傳遞方式包括表單提交、URL參數(shù)、JSON請(qǐng)求等,本文將介紹常見(jiàn)的幾種數(shù)據(jù)傳遞方式,并說(shuō)明如何在SpringBoot中實(shí)現(xiàn)這些方式,需要的朋友可以參考下
    2025-08-08
  • Java服務(wù)不可用問(wèn)題排查和解決

    Java服務(wù)不可用問(wèn)題排查和解決

    作為一名 java 開(kāi)發(fā)者,經(jīng)常會(huì)遇到服務(wù)不可用的問(wèn)題排查,導(dǎo)致問(wèn)題的原因可能是多種多樣的,但是在預(yù)先不知道是什么原因?qū)е碌姆?wù)不可用的時(shí)候,通用的排查手段和流程是相似的,故本文給大家介紹了Java服務(wù)不可用問(wèn)題排查方法和解決,需要的朋友可以參考下
    2025-01-01
  • springBoot mybatis 包掃描實(shí)例

    springBoot mybatis 包掃描實(shí)例

    這篇文章主要介紹了springBoot mybatis 包掃描實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java中常用排序方法有哪些詳解

    java中常用排序方法有哪些詳解

    排序算法經(jīng)過(guò)了很長(zhǎng)時(shí)間的演變,產(chǎn)生了很多種不同的方法,這篇文章主要介紹了java中常用排序方法有哪些的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-07-07

最新評(píng)論

蓬溪县| 墨玉县| 凤阳县| 宁河县| 德兴市| 襄城县| 会同县| 稻城县| 苗栗县| 依安县| 广丰县| 新乡县| 湖北省| 宁南县| 安康市| 科技| 东辽县| 榆树市| 庆元县| 吉水县| 景洪市| 叶城县| 龙里县| 静宁县| 惠水县| 武隆县| 石首市| 闵行区| 汾阳市| 于田县| 汝阳县| 吴江市| 华阴市| 江口县| 舒城县| 偏关县| 马关县| 铁岭县| 惠来县| 阿城市| 宜宾县|