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());
}