首先我们的场景:
我们有一个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/