不要编码param

时间:2017-10-06 00:16:49

标签: java jackson netflix-feign

我正在重构遗留代码库以使用Feign,我遇到了一些问题:

  1. 尽管使用logger和loglevel full
  2. 进行实例化,但没有Feign日志语句打印到控制台
  3. Feign不编码我的reservationSearch参数(Feign只是POST对象的toString)
  4. 假设定义

    public interface EPCReservationClient {
        @RequestLine("POST v1/searchReservations")
        @Headers({"clientId: {clientId}", "Content-Type: application/json", "Authentication: {authentication}"})
        @Body("{reservationSearch}")
        ReservationSearchResponse reservationSearch(
                @Param("authentication") String authentication, //apiToken
                @Param("clientId") String clientId,
                @Param("reservationSearch") ReservationSearch<ReservationSearchParameters> reservationSearch);
    }
    

    假设实例化

    Feign.builder()
                    .logger(new Logger.JavaLogger())
                    .decoder(new JacksonDecoder())
                    .encoder(new JacksonEncoder(new ObjectMapper().findAndRegisterModules()))
                    .logLevel(Logger.Level.FULL)
                    .target(EPCReservationClient.class, restUrl);
    

    Param类型(不要杀我,不是我的代码)

    public class ReservationSearch<T> {
    
        @JsonProperty("hotelID")
        private final int hotelID;
        private final String languageId;
        @JsonProperty("reservationSearchParameters")
        private final T parameters;
        @JsonProperty("reservationID")
        private final List<Long> reservationID;
    
        public ReservationSearch(int hotelID, T parameters, final List<Long> reservationID) {
            this.hotelID = hotelID;
            this.languageId = "1033";
            this.parameters = parameters;
            this.reservationID = Optional.ofNullable(reservationID)
                                         .orElseGet(Collections::emptyList);
        }
    
        public static ReservationSearch<ReservationSearchParameters> forLastName(
            int maxRecords, int hotelId, String lastName) {
            return new ReservationSearch<>(hotelId, new ReservationSearchParameters(maxRecords, lastName, null), null);
        }
    
        public static ReservationSearch<ReservationSearchParameters> forConfirmationNumber(
            int maxRecords, int hotelId, String number) {
            return new ReservationSearch<>(hotelId, new ReservationSearchParameters(maxRecords, null, number), null);
        }
    
        public static ReservationSearch<ReservationSearchParameters> forReservationId(
                final int maxRecords,
                final int hotelId,
                final String reservationNumber) {
            ReservationSearch<ReservationSearchParameters> reservationSearchParametersReservationSearch = new ReservationSearch<>(
                    hotelId,
                    new ReservationSearchParameters(
                            maxRecords,
                            null,
                            null),
                    Collections.singletonList(Long.valueOf(reservationNumber)));
            return reservationSearchParametersReservationSearch;
        }
    
        public int getHotelID() {
            return hotelID;
        }
    
        public String getLanguageId() {
            return languageId;
        }
    
        public T getParameters() {
            return parameters;
        }
    
        public List<Long> getReservationID() {
            return reservationID;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
    
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
    
            final ReservationSearch that = (ReservationSearch) o;
    
            return new EqualsBuilder()
                .append(hotelID, that.hotelID)
                .append(languageId, that.languageId)
                .append(parameters, that.parameters)
                .append(reservationID, that.reservationID)
                .isEquals();
        }
    
        @Override
        public int hashCode() {
            return new HashCodeBuilder(17, 37)
                .append(hotelID)
                .append(languageId)
                .append(parameters)
                .append(reservationID)
                .toHashCode();
        }
    
    }
    

    Param类型(不要杀我,不是我的代码)

    public class ReservationSearchParameters {
        private final String travelerLastName;
        private final String confirmationNumber;
        private final int maxRecordsLimit;
    
        public ReservationSearchParameters(int maxRecordsLimit, String travelerLastName, String confirmationNumber) {
            this.maxRecordsLimit = maxRecordsLimit;
            this.travelerLastName = travelerLastName;
            this.confirmationNumber = confirmationNumber;
        }
    
        public String getTravelerLastName() { return travelerLastName; }
    
        public String getConfirmationNumber() { return confirmationNumber; }
    
        public int getMaxRecordsLimit() { return maxRecordsLimit; }
    
    }
    

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

标题(@Headers@HeaderMap)和正文模板(@Body)参数始终被视为预编码。只有查询引用查询参数的参数(@QueryMap@Param)才会进行URL编码。

如果您希望通过Encoder对您的身体对象进行编码,请不要提供任何@Body模板,也不要使用{{1}注释您的身体参数}(仅用于模板参数)。然后,未注释的body参数将被输入@Param行中指定的Encoder