条目创建 returns a 201 但访问它 returns 404
Entry creation returns a 201 but accessing it returns 404
我有一个简单的 Spring Data Rest 用户创建实现,使用 Hibernate 和 MongoDB.
User.java:
@Data
@Entity
@RequiredArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
private @Id String username;
private String about;
}
UserRepository.java
@PreAuthorize("hasRole('ROLE_USER')")
@CrossOrigin(methods = {GET, PUT, POST})
public interface UserRepository extends MongoRepository<User, String> {
@Override
@PreAuthorize("hasRole('ROLE_ADMIN')")
<S extends User> S save(S s);
}
然后我用这个正文 POST 调用 /users
:
{
"username": "username1",
"about": "example"
}
我收到 201 Created
响应,正文如下:
{
"about": "example",
"_links": {
"self": {
"href": "http://localhost:8080/api/users/username1"
},
"user": {
"href": "http://localhost:8080/api/users/username1"
}
}
}
我向 /users
发出了 GET
请求,以查看是否确实添加了该用户,并且正确地返回了此响应,因此:
{
"_embedded": {
"users": [
{
"about": "example",
"_links": {
"self": {
"href": "http://localhost:8080/api/users/username1"
},
"user": {
"href": "http://localhost:8080/api/users/username1"
}
}
}
]
},
"_links": {
"self": {
"href": "http://localhost:8080/api/users{?page,size,sort}",
"templated": true
},
"profile": {
"href": "http://localhost:8080/api/profile/users"
}
},
"page": {
"size": 20,
"totalElements": 1,
"totalPages": 1,
"number": 0
}
}
问题
但随后我访问了链接中提供的用户的 URL,即 http://localhost:8080/api/users/username1
,但我得到了 404 Not Found
响应。
我做错了什么?我试过查看示例和文档,但似乎无济于事。如果我添加 @AutoGenerated
注释它可以工作,但我显然希望请求提供 id
作为 username
.
在User.java
中,我把username
的声明改成这样:
@Id
@JsonProperty("username")
@NotBlank
private String id;
默认情况下,MongoDb 需要 _id
作为每个文档的主键,否则它不会被索引。我不得不将字段名称更改为 id,以便它转换为带有 @Id
注释的 MongoDB 上的 _id
。为了在消费者方面解决这个问题,我使用 @JsonProperty("username")
从请求的 JSON 正文的 username
属性 中获取值。
我有一个简单的 Spring Data Rest 用户创建实现,使用 Hibernate 和 MongoDB.
User.java:
@Data
@Entity
@RequiredArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
private @Id String username;
private String about;
}
UserRepository.java
@PreAuthorize("hasRole('ROLE_USER')")
@CrossOrigin(methods = {GET, PUT, POST})
public interface UserRepository extends MongoRepository<User, String> {
@Override
@PreAuthorize("hasRole('ROLE_ADMIN')")
<S extends User> S save(S s);
}
然后我用这个正文 POST 调用 /users
:
{
"username": "username1",
"about": "example"
}
我收到 201 Created
响应,正文如下:
{
"about": "example",
"_links": {
"self": {
"href": "http://localhost:8080/api/users/username1"
},
"user": {
"href": "http://localhost:8080/api/users/username1"
}
}
}
我向 /users
发出了 GET
请求,以查看是否确实添加了该用户,并且正确地返回了此响应,因此:
{
"_embedded": {
"users": [
{
"about": "example",
"_links": {
"self": {
"href": "http://localhost:8080/api/users/username1"
},
"user": {
"href": "http://localhost:8080/api/users/username1"
}
}
}
]
},
"_links": {
"self": {
"href": "http://localhost:8080/api/users{?page,size,sort}",
"templated": true
},
"profile": {
"href": "http://localhost:8080/api/profile/users"
}
},
"page": {
"size": 20,
"totalElements": 1,
"totalPages": 1,
"number": 0
}
}
问题
但随后我访问了链接中提供的用户的 URL,即 http://localhost:8080/api/users/username1
,但我得到了 404 Not Found
响应。
我做错了什么?我试过查看示例和文档,但似乎无济于事。如果我添加 @AutoGenerated
注释它可以工作,但我显然希望请求提供 id
作为 username
.
在User.java
中,我把username
的声明改成这样:
@Id
@JsonProperty("username")
@NotBlank
private String id;
默认情况下,MongoDb 需要 _id
作为每个文档的主键,否则它不会被索引。我不得不将字段名称更改为 id,以便它转换为带有 @Id
注释的 MongoDB 上的 _id
。为了在消费者方面解决这个问题,我使用 @JsonProperty("username")
从请求的 JSON 正文的 username
属性 中获取值。