【问题标题】:Spring Rest Data - Foreign Key object URL not converted in @RequestBodySpring Rest 数据 - 未在 @RequestBody 中转换的外键对象 URL
【发布时间】:2015-01-20 19:40:12
【问题描述】:

我正在使用 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;
}

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

这是我的用户控制器:

@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"
        }
      }
    }

非常感谢您的宝贵时间!!

【问题讨论】:

    标签: java rest spring-mvc jpa spring-data


    【解决方案1】:

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

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

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

    如果您将您的用户实体公开为@RepositoryRestResource,那么您的原始请求应该可以工作

    【讨论】:

    • 但根据本指南:spring.io/guides/gs/accessing-data-rest.. @RepositoryRestResource 不需要导出存储库。它仅用于更改导出详细信息,例如使用 /people 代替 /persons 的默认值。
    • 我尝试将 @RepositoryRestResource 添加到我的 UserRepository 类中,但仍然是同样的问题.. :x
    • 你是否也删除了这个特定的控制器 - @RepositoryRestResource 公开了它自己的一组端点
    • 是的,我也尝试将发布请求发送给 /users,但我得到了同样的错误
    • 仍然坚持这一点......非常感谢您的帮助。 :(
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 2011-08-18
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      相关资源
      最近更新 更多