首先我们的场景:

我们有一个OSGI环境,其中几个捆绑发布了自己的剩余端点,例如:

http://localhost:8080/api/cars
http://localhost:8080/api/food
http://localhost:8080/api/toys


这是使用JAXRSServerFactoryBean.create()方法完成的,地址是上面列出的地址。

现在,我们需要向用户请求添加一个租户ID(不是user auth,这是不同的,因为用户可能是多个租户的一部分)。网址应如下所示:

http://localhost:8080/api/tenant/{tenantid}/cars
http://localhost:8080/api/tenant/{tenantid}/food
http://localhost:8080/api/tenant/{tenantid}/toys


我现在尝试了两种方法来实现此目的:


将租户ID添加到服务地址(http://localhost:8080/api/tenant/{tenantid})-结果:我可以在给定URL下访问我的服务,但是我无法为tenantid填充任何数据,但必须在URL中键入{tenantid},但这不是我需要如何使用它。
在相同的URL(http://localhost:8080/api)下发布所有三个服务,将租户部分移动到每个api类的@Path注释-结果:异常,该地址已被其他端点占用


有谁知道,如何正确地做到这一点?我知道ServiceBean可以将实现程序的数组作为参数而不是单个类,但是这不是一个选择,因为当我尝试将其“全部集成”时,捆绑包是分别加载的,并且存在一些依赖项问题。

作为一个旁注:我知道,我们可以将租户ID放在标题中,但是通常,租户信息位于URL(主机或路径)中的某个位置,并且我们希望采用这种“通用”样式,而不是添加自定义标题,尽管实现标题样式会容易得多(已经可以使用了)。

任何想法都会有所帮助。
谢谢,
y

最佳答案

尝试类似的东西:

@Path("/tenants")
public class TenantResource{

    @Path("/{tenantId}/cars")
    @Get
    public List<Car> getTenantCars(@PathParam("tenantId") long tenantId){...}

    @Path("/{tenantId}/food")
    @Get
    public Food getTenantFood(@PathParam("tenantId") long tenantId){...}

    @Path("/{tenantId}/toys")
    @Get
    public List<Toy> getTenantToys(@PathParam("tenantId") long tenantId){...}
}


如果您具有诸如tenant / {tenantid} / cars之类的URL,则通常意味着“ id = tenantid的租户的汽车”。

“汽车”是“租户”资源的属性,因此应位于同一资源中。
我认为可能很难对资源/对象的属性进行模块化。

但是您可以考虑“汽车”资源并查询该资源,例如:/ cars?tenantid = {tenantid}

@Path("/cars")
public class CarResource{

    @Get
    public List<Car> getCarsByTenantId(@QueryParam("tenantId") long tenantId){...}

}


或类似。

关于java - 如何发布多个具有相同基址的其余端点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44775161/

10-10 05:44