实现自定义返回数据类型(ResponseBodyAdvice)

1.编写RequestBodyAdvice接口实现类,实现数据的自定义返回

package com.ciip.cloud.core.common.config;

import cn.hutool.core.bean.BeanPath;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.ciip.cloud.core.common.annotation.CIIPDataView;
import com.ciip.cloud.core.common.vo.ResponseMessage;
import org.springframework.core.MethodParameter;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.*;

/**
 * Title: CIIPDataViewResponseBodyAdvice
 * Description: TODO
 *
 * @author kindin
 */
@ControllerAdvice
public class CIIPDataViewResponseBodyAdvice implements ResponseBodyAdvice {
	/**
	 * 
	 *
 	*/
    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter returnType, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        CIIPDataView annotation = (CIIPDataView)returnType.getMethodAnnotation(CIIPDataView.class);
        if(!StrUtil.isEmptyIfStr(annotation)){
            String[] fields = annotation.fields();
            return  GenerateDynamicBean(o,fields);
        }
        return o;

    }

    public  Object GenerateDynamicBean(Object result,String[] fields){
        if(result instanceof ResponseMessage){
            ResponseMessage responseMessage =(ResponseMessage)result;
            if(responseMessage.getCode()>=0){
                List<Map<Object,Object>> dynaBeans = new ArrayList<Map<Object,Object>>();
                if(responseMessage.getData() instanceof Page){
                     Page page =(Page)responseMessage.getData();
                    (page.getContent()).forEach(obj-> {
                        Map<Object,Object> bean = parseBean(obj,fields);
                        dynaBeans.add(bean);
                    });
                    Page pages =  new PageImpl(dynaBeans, page.getPageable(), page.getTotalElements());
                    responseMessage.setData(pages);
                    return responseMessage;
                }
                if(responseMessage.getData() instanceof List){
                    ((List) responseMessage.getData()).forEach(obj->{
                        Map<Object,Object> bean = parseBean(obj,fields);
                        dynaBeans.add(bean);
                    });
                    responseMessage.setData(dynaBeans);
                    return responseMessage;
                }
                if(responseMessage.getData() instanceof Object){
                    Map<Object,Object> bean = parseBean(responseMessage.getData(),fields);
                    responseMessage.setData(bean);
                    return responseMessage;
                }
            }
        }
        return result;
    }


    public Map<Object,Object> parseBean(Object obj,String[] fields){
        Map<Object,Object> bean = new HashMap<Object,Object>();
        List<String> split = new ArrayList<String>(Arrays.asList(fields));
        split.forEach(field->{
            if(StrUtil.indexOf(field,'.')!=-1){
                int index = StrUtil.lastIndexOf(field,".",field.lastIndexOf('.'),true);
                String f = StrUtil.sub(field,index+1,field.length());
                BeanPath resolver = new BeanPath(field);
                Object v = Objects.nonNull(resolver.get(obj))?resolver.get(obj):"";
                //如果等于空,表示没有重复
                if(Objects.isNull(bean.get(f))){
                    bean.put(f, v);
                }else{
                    bean.put(field, v);
                }
            }else{
                bean.put(field, ReflectUtil.getFieldValue(obj,field));
            }
        });
       return bean;
    }
}

2.编写注解类-CIIPDataView

package com.ciip.cloud.core.common.annotation;

import java.lang.annotation.*;

/**
 * Title: CIIPDataView
 * Description: TODO
 *
 * @author kindin
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CIIPDataView {
    //要用来显示的字段
    String[] fields();
}

3.编写控制层进行测试,加上注解,选择要返回的字段名称即可

@GetMapping(value = CIIPCommonConstant.ApiAuth.ANON + "/generateDynamicBean")
@CIIPDataView(fields = {"username","mobile","email","enterpriseUser.companyName","enterpriseUser.logo.fileName","enterpriseUser.businessLicensePath.fileName","enterpriseUser.companyAdvResources[0].fileName"})
 public ResponseMessage generateDynamicBean(){
      Specification<CiipUser> specification = Specifications.<CiipUser>and()
              .eq("memberType", CiipMemberType.COMPANY.ordinal())
              .ne("enterpriseUser",null)
              .build();
      Pageable pageable = PageRequest.of(0, 20);
      Page<CiipUser> userpage = ciipUserRepository.findAll(specification,pageable);
      
      return ResultUtil.success(userpage, ProjectStatusCode.PROJECTMEMBER_FIND_STAFF_SUCCESS.getCode(),ProjectStatusCode.PROJECTMEMBER_FIND_STAFF_SUCCESS.getMsg());
    }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值