繁体   English   中英

Spring Rest数据 - 未在@RequestBody中转换的外键对象URL

[英]Spring Rest Data - Foreign Key object URL not converted in @RequestBody

我正在使用Spring Rest Data,我已经将我的应用程序配置为使用RepositoryRestMvcConfiguration。 我有以下2个实体:

企业有很多用户关系。

@Entity
@Table(name="enterprise")
public class Enterprise extends BaseEntity
{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="enterprise_id")
    private Long id;

    @Column(name="enterprise_name")
    private String name;
}

@Entity
@Table(name="user")
public class User extends BaseEntity
{
    @Id
    @Column(name="user_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "owner_enterprise_id", referencedColumnName = "enterprise_id")
    private Enterprise ownerEnterprise;

    @Column(name="username")
    private String userName;

    @Column(name="emailaddress")
    private String emailAddress;

    @Column(name="passwordhash")
    private String password;
}

我能够发送post请求来创建企业,接下来我要做的是创建一个对企业有FK的用户。

这是我的UserController:

@RequestMapping(value="/createUser", method=RequestMethod.POST)
public ResponseEntity<User> register(@RequestBody User user) {

    User newUser = userService.register(user);
    return new ResponseEntity<User>(newUser, HttpStatus.OK);
}

当我尝试发送帖子来创建新用户时:

curl -i -X POST \
-H "Content-Type: application/json" \
-d '{"userName":"johndoe", "emailAddress":"johndoe@gmail.com", "password":"johnpass1", "ownerEnterprise":"http://localhost:8080/enterprises/1"
}' \
http://localhost:8080/createUser

我在我的控制器中放置了断点,并看到User对象的ownerEnterprise字段为空(但其他字段包含正确的数据)。 有人可以帮我告诉我我错过了什么吗? 我试图搜索这几个小时,没有运气。

我还验证了网址是否正确:

curl http://localhost:8080/enterprises/1 

    {
      "name" : "MyEnterprise",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/enterprises/1"
        }
      }
    }

非常感谢你的时间!

您的界面不是基于Spring-Data-REST的界面,它是一个直接的Spring MVC请求,因此以下类型的POST应该适合您:

{"userName":"johndoe", "emailAddress":"johndoe@gmail.com", "password":"johnpass1", "ownerEnterprise":{"id":1, "name":"Test Enterprise"}}

本质上,这是您的User实体的json表示。

如果您将User实体公开为@RepositoryRestResource那么您的原始请求应该有效

我遇到了同样的问题。 在企业类中添加构造函数应该可以解决它。

public Enterprise(Long id) {
    super();
    this.id = id;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM