[英]Posting complex object at once in REST api or progressively add subresources?
[英]REST add subresources
在研究REST時,我偶然發現了子資源,做了一些實驗,但沒有成功。 這是代碼,我正在使用RESTeasy 3.0.9。
@Path(value="/user")
public interface UsersHttp {
@GET
@Produces(MediaType.APPLICATION_JSON)
public User[] getUsers();
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public User getUser(@PathParam("id") Long id);
...
}
此接口是通過以下會話bean實現的:
@Stateless
public class UsersHttpImpl implements UsersHttp {
@Inject
private UserPersistence persist;
@Inject
private MediaUtils mediaUtils;
@Override
public User[] getUsers() {
return persist.getUsers(null);
}
@Override
public User getUser(Long id) {
return persist.getUser(id);
}
...
}
這是User
類的代碼段:
@SuppressWarnings("serial")
@Entity
@Table(name = "usr_user")
@XmlRootElement
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "usr_id")
private Long id;
@Column(name = "usr_name", nullable = false)
private String name;
...
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Path("/name")
public String getName() {
return name;
}
...
}
我可以通過MyApplication/user/1
成功獲得一個User
,但是當我使用MyApplication/user/1/name
進行GET
,我得到的是javax.ws.rs.NotFoundException
,我期待的是Alice
。 我錯過了什么?
您沒有任何映射到請求URI中name
部分的內容。 @Path
不能那樣工作(將其放入模型類中)。
如果只想過濾名稱,我建議使用查詢參數或矩陣參數(請參閱此處的更多信息 )。 根據提供的參數,您可以創建部分表示。 好的文章可以在這里閱讀。 一個簡單的例子可能是
// ...users/1234?filter=name,age
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public UserDTO getUser(@PathParam("id") Long id,
@QueryParam("filter") String filter) {
User user = service.findUserById(id);
String[] include = filter.split(",");
UserDTO dto = new UserDTO();
for (String s: include) {
// set dto fields based on the filter
// example in psuedo code
if (s equals name)
dto.setName(user.getName());
}
return dto;
}
根據編組的提供者,您可能需要配置一些設置以忽略空字段。
也就是說,這甚至可能不是您的主要問題/關注點。 如果您只是想了解子資源,那您會有點失望。 在JAX-RS的上下文中,這不是獲得“資源的一部分”的方法。
基本上,子資源/子資源方法是任何帶@Path
注釋的方法。 該類是根資源,任何未用@Path
注釋的方法都是可以在根資源上執行的操作。 任何帶@Path
注釋的方法都是根資源的子資源。 在您的情況下, user
(我將成為users
)是“集合資源”,並且在方法上使用“ @Path(“ {id}”)`,則表示您想要的是子資源,即單個用戶。
然后是子資源定位器的概念,其原理略有不同。 在這里,我們說可以通過root-resource類找到另一個資源類,例如
@Path("/users")
public class UserResource {
@GET
@Path("{id}/friends")
public FriendsResource getFriendsResource(@PathParam("id") lond id) {
User user = service.getUserById(id);
return new FriendsResource(user);
}
}
public class FriendsResource {
User user;
public FriendResource(User user) {
this.user = user;
}
@GET
public List<Friend> getAllFriends() {
return user.getFriends();
}
}
上面的代碼將導致URI ...users/1234/friends
轉到FriendsResource
類,並調用getAllFriends()
。
在JAX-RS的上下文中,這幾乎就是子資源的要旨。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.