簡體   English   中英

Spring Boot - 使用 Lombok 時,Rest Controller 返回空對象

[英]Spring Boot - Rest Controller is returning empty object when using Lombok

我正在使用 Spring Boot 2.1.4 和Gradle 5.0開發一個簡單的 Rest API。 我正在使用Lombok v1.18.6來構建我的類,但是當我調用服務時,我收到了一個空對象

我嘗試手動添加 getter 和 setter 方法並解決了問題,但我想知道為什么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
@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": []
    }
]

實際上,我覺得奇怪的是,顯示的唯一屬性是具有@JsonProperty注釋的languages ,為什么會發生這種情況?

更新

我剛剛意識到我的 IDE (IntelliJ) 正在識別 lombok 插件,並且我也啟用了注釋處理,但是當我嘗試使用 getter 或 setter 執行我的代碼時,它會引發錯誤:

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

它可能不適合您的原因是,您的項目未設置為將IDE構建委派給Gradle,並且未對項目啟用注釋處理,或者以某種方式錯誤配置。
設置 - >構建,執行,部署 - >構建工具 - Gradle - > Runner
設置 - >構建,執行,部署 - >編譯器 - >注釋處理器

您是否嘗試從命令行構建並運行Gradle,以排除IntelliJ中的錯誤配置?

我懷疑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,這意味着實體中的單個更改將破壞緩存並可能阻止實體正確加載。

這可能是由於categoryService.findAll(); 具有不同的映射名稱。

例如,對於idCategory ,結果有id_category 由於這個id_category沒有被映射到idCategory

所以你可以使用,

@JsonProperty("idCategory")

確保啟用選項注釋處理,重新運行完全😉的項目 確保啟用選項注釋處理

你可以用這個注釋

@JsonProperty("idCategory")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM