Spring Boot - Rest Controller возвращает пустой объект при использовании Lombok - PullRequest
5 голосов
/ 20 апреля 2019

Я занимаюсь разработкой простого API отдыха с Spring Boot 2.1.4 и Gradle 5.0. Я использую Lombok v1.18.6 для создания своих классов, но когда я вызываю сервисы, я получаю пустой объект

Я попытался добавить методы получения и установки вручную, и это устранило проблему, но я хотел бы знать, почему lombok не работает в моем проекте.

Кроме того, моя среда IDE правильно определяет подключение lombok. Я использую IntelliJ IDEA

Моя зависимость от gradle:

    compileOnly 'org.projectlombok:lombok:1.18.6'
    annotationProcessor 'org.projectlombok:lombok:1.18.6'

Класс моей модели:

@Entity
@Data
public class Category implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_category")
    private int idCategory;

    @NotBlank
    private String name;

    @OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private List<Language> languages;
}

Мой RestController:

@RestController
@RequestMapping("/categories")
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    @GetMapping
    public ResponseEntity<List<Category>> findAllCategories(){
        List<Category> categories = categoryService.findAll();
        return new ResponseEntity<List<Category>>(categories, HttpStatus.OK);
    }
}

Я получаю этот ответ:

[
    {
        "languages": []
    }
]

Но я ожидаю получить:

[
    {
        "idCategory": 1,
        "name": "Backend" 
        "languages": []
    }
]

На самом деле, я нахожу странным, что показывается только атрибут languages, который имеет аннотацию @JsonProperty, почему это происходит?

UPDATE

Я только что понял, что моя IDE (IntelliJ) распознает подключение lombok, и у меня также включена обработка аннотаций, но когда я пытаюсь выполнить мой код с помощью геттера или установщика, он выдает ошибку:

Error:(18, 26) java: cannot find symbol
  symbol:   method setName(java.lang.String)
  location: class com.ramonparis.cvmanager.model.Category

Ответы [ 4 ]

1 голос
/ 20 апреля 2019

Причина, по которой он может не работать для вас, заключается в том, что ваш проект не настроен на делегирование сборок IDE Gradle, а обработка аннотаций не включена для проекта или неправильно настроена.
Настройки -> Сборка, Выполнение, Развертывание -> Инструменты сборки - Gradle -> Runner
Настройки -> Сборка, выполнение, развертывание -> Компилятор -> Процессоры аннотаций

Вы пытались собрать и запустить Gradle из командной строки, чтобы исключить неправильную настройку в IntelliJ?

0 голосов
/ 02 июня 2019

Убедитесь, что включили опцию обработки аннотаций, перезапустите свой проект, который все ? make sure enable the option annotation processing

0 голосов
/ 20 апреля 2019

Это может быть связано с тем, что categoryService.findAll(); имеет разные имена сопоставлений.

Например, для idCategory результат имеет id_category.Из-за этого id_category не отображается на idCategory.

Так что вы можете использовать,

@JsonProperty("idCategory")
0 голосов
/ 20 апреля 2019

Я подозреваю, что Hibernate не любит полных равных, которые Lombok генерирует автоматически. Вам следует попробовать:

@Entity
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Category implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @EqualsAndHashCode.Include
    @Column(name = "id_category")
    private int idCategory;

Hibernate ожидает, что его контекстный кеш совпадает на PrimaryKeys, но Lombok генерирует Equals, который соответствует всем полям, что означает, что одно изменение в сущности повредит кеш и может помешать правильной загрузке сущности.

...