簡體   English   中英

REST添加子資源

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM