Метод не определен независимо от использования lomboks @Data при вызове rest api - PullRequest
0 голосов
/ 23 июня 2018

У меня есть веб-приложение Spring в Maven с остальным API. Проект компилируется и сервер Tomcat запускается без проблем, но когда я вызываю какую-то службу отдыха из браузера, я получаю сообщение об ошибке, что метод getter не определен, метод, который должен генерироваться Lombok.

Я деломбок-редактировал класс с помощью этого геттера, чтобы увидеть, правильно ли сгенерировал Ломбок геттер, и он это сделал, геттер есть, но когда метод вызывается вызовом rest api, я получаю исключение.

класс Ломбок-эд:

@XmlRootElement
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table
public class HeroEntity
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Version
    private int version;

    @Column
    private String name;

    @ManyToMany(mappedBy = "heroes")
    private List<ComicBookEntity> comicBooks;
}

Метод, который выдает исключение:

@Override
    public HeroEntity add(HeroEntity heroEntity) throws DuplicateResourceException
    {
        try {
            return _heroRepository.save(heroEntity);
        }catch(final DataIntegrityViolationException e) {
            throw new DuplicateResourceException(ResourceType.HERO,
                    "Hero with id: "+heroEntity.getId()+" already exists");
        }
    }

Исключение выдается в методе add при вызове heroEntity.getId(). Этот геттер должен быть сгенерирован Lombok, как я деломбок-класс, и все в порядке, но я все еще получаю исключение.

pom.xml:

             <plugin>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-maven-plugin</artifactId>
                <version>1.18.0.0</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>delombok</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>



<dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>

1 Ответ

0 голосов
/ 25 июня 2018

AFAIK Lombok «работает» (т.е. генерирует методы и т. Д.) Только на этапе компиляции. Все его аннотации имеют политику хранения «ИСТОЧНИК». После того, как lombok завершит генерацию метода, во время выполнения будет невозможно «различить» нативные методы от методов, сгенерированных lombok.

С другой стороны, другие аннотации (здесь JPA, JAXB) обрабатываются во время выполнения, поэтому они не будут мешать или что-то в этом роде.

Итак, я предполагаю, что если во время выполнения JVM жалуется, что метод не существует, его действительно нет.

Теперь, если во время выполнения метода нет, его, вероятно, действительно нет :) На самом деле вопрос в том, не работал ли Lombok вообще или генерировал что-то, что JPA / Hibernate не распознает как допустимый метод.

Как это проверить?

Я предлагаю просто физически открыть ваш военный файл (опять же, я неявно предполагаю, что у вас есть файл WAR в tomcat), найдите HeroEntity.class внутри WEB-INF/lib/one-of-your-jars.jar и запустите его через какой-нибудь дизассемблер, например JAD или javap - просто чтобы увидеть, что генерируется. Если вы видите, что есть какой-то метод получения, возможно, его тип возврата не соответствует ожиданиям Hibernate (Long против long и т. Д.)

В качестве альтернативы, если вообще нет геттера, то Lombok не работает, и вы должны проверить свою сборку

Я знаю, что это скорее предположение, а не точный и точный ответ, но похоже, что здесь недостаточно информации, не потому, что вопрос плохой или что-то в этом роде, а потому, что есть вероятность, что под капот вашего проекта, который может повлиять на ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...