网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

openfeignget请求参数dto出现错误怎么解决

本篇内容主要讲解“openfeign get请求参数dto出现错误怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“openfeign get请求参数dto出现错误怎么解决”吧!

按需搭建网站可以根据自己的需求进行定制,成都网站设计、成都网站制作构思过程中功能建设理应排到主要部位公司成都网站设计、成都网站制作的运用实际效果公司网站制作网站建立与制做的实际意义

项目中使用的是spring boot 2.3.3,spring-cloud Hoxton.SR8.

在使用feign调用服务时 使用@GetMapping 和 @SpringQueryMap 和传输DTO对象,其中DTO对象中包含LocalDateTime属性,一直报类型转换异常,无法调用服务。解决方法有很多,找了网上很多解决办法都没效果,大体都是FastJson 序列化之类的(可能每个项目差异吧), 解决过程分析暂不分析吧。先行记录一下,因为看到网上很多人貌似都遇到过这个问题。以下是服务提供方

@FeignClient(value = "user-service", path = "/user/v1")
public interface UserClient {
@GetMapping("/")
PageVO getUserList(@SpringQueryMap UserDTO userDTO);
}
@Data
@ApiModel(value = "运营平台用户列表查询参数")
public class UserDTO implements Serializable {
    private static final long serialVersionUID = -3767202379100110105L;

    @ApiModelProperty(value = "用户id")
    private Long id;

    @Size(max = 12, message = "nickName:用户昵称最大长度为12")
    @ApiModelProperty(value = "用户昵称")
    private String nickName;

    @ApiModelProperty(value = "手机号码")
    private String phone;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建时间开始")
    private LocalDateTime createdAtStart;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建时间结束")
    private LocalDateTime createdAtEnd;

    @ApiModelProperty(value = "页码", required = true)
    private Integer page;

    @ApiModelProperty(value = "每页条数", required = true)
    private Integer size;
}

核心重点:新增一个QueryMapEncoder 

import feign.Param;
import feign.QueryMapEncoder;
import feign.codec.EncodeException;

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

public class LocalDateTimeQueryMapEncoder implements QueryMapEncoder {
    private final Map, ObjectParamMetadata> classToMetadata =
            new HashMap, ObjectParamMetadata>();
    private final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public Map encode(Object object) throws EncodeException {
        try {
            ObjectParamMetadata metadata = getMetadata(object.getClass());
            Map propertyNameToValue = new HashMap();
            for (PropertyDescriptor pd : metadata.objectProperties) {
                Method method = pd.getReadMethod();

                Object value = method.invoke(object);
                if (value != null && value != object) {
                    Param alias = method.getAnnotation(Param.class);
                    String name = alias != null ? alias.value() : pd.getName();

                    if("java.time.LocalDateTime".equals(method.getReturnType().getName())){
                        //propertyNameToValue.put(name, "2020-10-07 01:01:00");
                        propertyNameToValue.put(name, dtf.format((LocalDateTime)value));
                    }else{
                        propertyNameToValue.put(name, value);
                    }

                }
            }
            return propertyNameToValue;
        } catch (IllegalAccessException | IntrospectionException | InvocationTargetException e) {
            throw new EncodeException("Failure encoding object into query map", e);
        }
    }

    private ObjectParamMetadata getMetadata(Class objectType) throws IntrospectionException {
        ObjectParamMetadata metadata = classToMetadata.get(objectType);
        if (metadata == null) {
            metadata = ObjectParamMetadata.parseObjectType(objectType);
            classToMetadata.put(objectType, metadata);
        }
        return metadata;
    }

    private static class ObjectParamMetadata {

        private final List objectProperties;

        private ObjectParamMetadata(List objectProperties) {
            this.objectProperties = Collections.unmodifiableList(objectProperties);
        }

        private static ObjectParamMetadata parseObjectType(Class type)
                throws IntrospectionException {
            List properties = new ArrayList();

            for (PropertyDescriptor pd : Introspector.getBeanInfo(type).getPropertyDescriptors()) {
                boolean isGetterMethod = pd.getReadMethod() != null && !"class".equals(pd.getName());
                if (isGetterMethod) {
                    properties.add(pd);
                }
            }

            return new ObjectParamMetadata(properties);
        }
    }
}
@Configuration
public class CustomFeignConfig {
     

    @Bean
    public Feign.Builder feignBuilder() {
        return Feign.builder()
                .queryMapEncoder(new LocalDateTimeQueryMapEncoder())
                .retryer(Retryer.NEVER_RETRY);
    }

}

到此,相信大家对“openfeign get请求参数dto出现错误怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


网站题目:openfeignget请求参数dto出现错误怎么解决
网页地址:http://bjjierui.cn/article/jsphss.html

其他资讯