如何在单个请求中访问多个资源:Jersey Rest

时间:2011-09-12 18:07:53

标签: rest resources jersey

我正在尝试为以下场景找到一个好的设计。 我有一个POST休息服务,它将作为数据提供一系列服务。而这又应该逐个调用它们来聚合服务器上的结果并将它们发送回客户端。

@Path("/resource1") @Path("/resource2") @Path("/collection")

Post data to /collection {["serviceName": "resource1", "data":"test1"], ["serviceName":"resource2","data":"test2"]}

我需要resource1和resource2的原因是,因为这些服务也可以独立调用。如果可能,我想重用相同的设置。 有没有办法做到这一点。 我正在使用带弹簧的球衣。

1 个答案:

答案 0 :(得分:1)

不确定这些资源有什么共同之处。如果post方法对所有这些方法具有相同的签名,则可以使用它们实现的抽象类或接口来定义post方法,并且可以尝试使用ResourceContext.matchResource来执行此操作。例如。像这样的东西:

public abstract class AbstractResource {
    public abstract String post(Object data);
}

@Path("/resource1")
public class Resource1 extends AbstractResource {
    @POST
    public String post(String data) {
        // do something
    }
}

@Path("/collection")
public class CollectionResource {
    @Context
    private ResourceContext rc;

    @POST
    @Consumes("application/json")
    public String post(List<PostRequest> postRequests) {
        StringBuilder result = new StringBuilder();
        for (PostRequest pr : postRequests) {
            // should wrap this in try-catch
            AbstractResource ar = rc.matchResource(pr.resource,
                    AbstractResource.class);
            sb.append(ar.post(pr.data));
        }
        return result.toString();
    }
}

@XmlRootElement
public class PostRequest {
    public String resource;
    public String data;
}

希望你有了这个主意,并且能够玩它并调整它以满足你的需求。