为什么关联资源没有绑定

Why association resource is not binding

我正在使用 spring 数据休息。当我尝试使用 post 方法和 application/json 使用以下对象创建资源时,关联资源未绑定,尽管它们已经存在于 db

{
screeName : 'adsaf',
screenType : {
   screenTypeId : 1,
   screenTypeName : 'Fixed'
}
}

为什么?除了单独设置关联之外,还有其他方法可以完成此任务吗?我问这个问题是因为如果我在控制器中手动接收此表单并使用 ObjectMapper 反序列化然后保存此对象,则将设置所有关联。那为什么它没有发生在 spring data rest

Spring 数据 REST works 带有指向资源的链接,因此您必须将有效负载更改为如下内容:

POST http://localhost:8080/api/screens

{
    "screenName": "adsaf",
    "screenType": "http://localhost:8080/api/screenTypes/1"
}

如果您在 POST Screen 对象时也需要保存 ScreenType,您应该关闭 ScreenType 存储库的导出:

@RepositoryRestResource(exported = false)
public interface ScreenTypeRepo extends JpaRepository<ScreenType, ...> {
}

并将级联(至少 PERSIST)添加到 Screen 实体中的 screenType 字段:

public class Screen {
    //...
    @ManyToOne(cascade = CascadeType.PERSIST)
    ScreenType screenType; 
}

这意味着 ScreenType 将由 Screen 管理。在这种情况下,您可以使用这样的有效负载:

POST http://localhost:8080/api/screens

{
    "screenName": "adsaf",
    "screenType": {
        "screenTypeName": "Fixed"
    }
}

与 Screen 同时创建新的 ScreenType。

这可以使用自定义 HttpMessageConverter 来完成。检查以下线程。