Java: несовместимые типы: java.lang.Long нельзя преобразовать в ValidFor

у меня два класса

  1. Построитель для объекта SpecContext
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Builder;
import lombok.Data;
import lombok.Value;

import javax.annotation.Nullable;


@Data
@Builder
@JsonIgnoreProperties(ignoreUnknown = true)
public class SpecContext {

    private Long globalPriceId;

    private Long priceId;

    private ValidFor validFor;




    @JsonCreator
    public SpecContext(
            @JsonProperty(value = "globalPriceId")
            Long globalPriceId,
            @JsonProperty(value = "validFor")
            ValidFor validFor,
            @JsonProperty(value = "priceId")
            Long priceId
    ) {
        this.globalPriceId = globalPriceId;
        this.validFor = validFor;
        this.priceId = priceId;

    }

}
  1. Построитель объекта ValidFor
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import utils.DateJsonDeserializer;
import utils.DateJsonSerializer;
import lombok.*;

import java.time.LocalDateTime;

@Data
@Value
@JsonIgnoreProperties(ignoreUnknown = true)
public class ValidFor {
    private LocalDateTime startDateTime;
    private LocalDateTime endDateTime;
    public static final String START_DATE_TIME = "startDateTime";
    public static final String END_DATE_TIME = "endDateTime";


    @JsonCreator
    public ValidFor(
            @JsonDeserialize(using = DateJsonDeserializer.class)
            @JsonSerialize(using = DateJsonSerializer.class)
            @JsonProperty(value = START_DATE_TIME)
                    LocalDateTime startDateTime,

            @JsonDeserialize(using = DateJsonDeserializer.class)
            @JsonSerialize(using = DateJsonSerializer.class)
            @JsonProperty(value = END_DATE_TIME)
                    LocalDateTime endDateTime)
            {
        this.startDateTime = startDateTime;
        this.endDateTime = endDateTime;
    }




    public static ValidForBuilder builder() {
        return new ValidForBuilder();
    }

    public static class ValidForBuilder {
        private LocalDateTime startDateTime;
        private LocalDateTime endDateTime;

        public ValidForBuilder() {
        }

        public ValidForBuilder startDateTime(LocalDateTime startDateTime) {
            this.startDateTime = startDateTime;
            return this;
        }

        public ValidForBuilder endDateTime(LocalDateTime endDateTime) {
            this.endDateTime = endDateTime;
            return this;
        }

        public ValidFor build() {

            return new ValidFor(startDateTime, endDateTime);
        }
    }

}

Я использую это в автотесте:

void test() {

    SpecContext sp = SpecContext.builder()
            .globalPriceId(101928081L)
            .priceId(2L)
            .validFor(ValidFor.builder().
                    startDateTime(LocalDateTime.of(2019, 10, 10, 14, 15, 00))
                    .endDateTime(LocalDateTime.of(2025, 10, 10, 14, 15, 00))
                    .build())
            .build();

Во время компиляции я получил ошибку java: incompatible types: java.lang.Long cannot be converted to ValidFor Я не понимаю, почему globalPriceId и priceId пытаются преобразовать в ValidFor?

Я пытался использовать Lombok @Builder для ValidFor, но получил ту же ошибку.

Как я могу решить эту проблему? Спасибо

где в вашем коде вы получаете эту проблему?

Stultuske 11.05.2023 12:39

Я получил это во время сборки (сборка не удалась). Он указал на аннотацию @Builder в классе SpecContext.

Stitch 11.05.2023 12:43

Я провел небольшой эксперимент и изменил тип Long для globalPriceId и priceId на тип Integer и получил ошибку java: incompatible types: java.lang.Integer cannot be converted to ValidFor

Stitch 11.05.2023 12:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Lombok @Builder требует, чтобы у вас был конструктор, содержащий все поля в том же порядке, в котором перечислены ваши поля. Вот почему @Builder сгенерирует это для вас, но если вы хотите написать свой собственный конструктор, вы тоже можете это сделать. Вы сделали это здесь, и список аргументов вашего конструктора не совпадает - вы поменяли местами заказы: в вашем конструкторе порядок: [Long globalPriceId, ValidFor validFor, Long priceId], но в ваших полях порядок [Long globalPriceId, Long priceId, ValidFor validFor].

Другие вопросы по теме