首先是我们的情景:
我们有一个OSGI环境,其中有几个bundle发布他们自己的rest端点,例如:
http://localhost:8080/api/cars
http://localhost:8080/api/food
http://localhost:8080/api/toys
这是使用JAXRSServerFactoryBean.create()方法完成的,地址是上面列出的地址。
现在我们需要为用户请求添加租户ID(而不是用户身份验证,这是不同的,因为用户可能是多个租户的一部分)。网址应如下所示:
http://localhost:8080/api/tenant/{tenantid}/cars
http://localhost:8080/api/tenant/{tenantid}/food
http://localhost:8080/api/tenant/{tenantid}/toys
我现在尝试了两种方法来实现这一目标:
http://localhost:8080/api/tenant/{tenantid}
) - 结果:我可以在给定的网址下访问我的服务,但我无法填写任何数据以进行tenantid但是必须在URL中键入{tenantid},这不是我需要使用它的方式。http://localhost:8080/api
)下发布所有三项服务,将租户部分移动到每个api类的@Path注释 - 结果:异常,该地址已由其他终点有没有人有这个想法,如何做到这一点?我知道ServiceBean可以将一个实现者数组作为参数而不是单个类,但这不是一个选项,因为bundle单独加载并且我有一些依赖性问题,当我尝试制作这个" all in一个"
作为旁注:我知道,我们可以将租户ID放在标题中,但通常租户信息位于URL(主机或路径)中的某个位置,我们想要使用这个"常见"样式而不是添加自定义标题,虽然标题样式的实现会更容易(已经让它工作)。
任何想法都会有所帮助。 谢谢, 凯
答案 0 :(得分:0)
尝试类似:
@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){...}
}
如果您有诸如租户/ {tenantid} / cars之类的网址,那么这通常意味着&#34;租户的车辆,其id = tenantid&#34;。
&#34;汽车&#34;是&#34;租户的财产&#34;资源,因此应该在同一资源。 我认为模块化资源/对象的属性可能很困难。
但你可以考虑一辆&#34;汽车&#34;资源和查询资源,如:/ cars?tenantid = {tenantid}
@Path("/cars")
public class CarResource{
@Get
public List<Car> getCarsByTenantId(@QueryParam("tenantId") long tenantId){...}
}
或类似。