【问题标题】:Jersey Conditional Pathing泽西条件路径
【发布时间】:2019-10-08 16:16:09
【问题描述】:

我有一个场景,我们支持 2 种不同类型的经过身份验证的用户(UserTypeA、UserTypeB),但它们永远不会在同一个服务器环境中使用。现在,我们使用 2 个不同的 url 路径 /path/usertypea/list/path/usertypeb/list。如果可能的话,我们想让它们使用相同的路径,例如/path/list,并且有一个环境变量是知道将流量路由到哪里的条件。每种用户类型的参数并不完全相同,数据的组织方式存在一些差异。我们正在使用泽西岛。

我尝试了一些类似单例类的东西:https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/user-guide.html#d0e2650 / https://stackoverflow.com/a/33585724/12183373 但它从不路由值,它只是返回类的名称而不是我期望的 JSON 有效负载。

以下是部分代码:

@Path("/list")
public class GlobalSegmentServiceRouter {
    @GET
    @Produces("application/json")
    public Class<?> findAll() {
        boolean isUserTypeA = false;
        if (isUserTypeA) {
            return UserTypeAService.class;
        } else {
            return UserTypeBService.class;
        }
    }
}

然后我有 2 个单独的类文件用于以下内容:

@Singleton
public class UserTypeAService {
    public List<String> findAll(/*Parameters for A*/) {
        // Do work here for User Type A
    }
}
@Singleton
public class UserTypeBService {
    public List<String> findAll(/*Parameters for B*/) {
        // Do work here for User Type B
    }
}

当我尝试点击端点时,我得到的响应是:

"com.test.services.UserTypeAService"

关于如何完成此任务的任何建议?

【问题讨论】:

  • 即使您提到您尝试过的方法不起作用,如果您可以发布代码示例,那么这将有助于解决您的问题。也许您的解决方案很接近,但只需要一些调整。
  • 完成!抱歉,一开始就应该这样做。
  • 没问题,您发布了很好的示例,这些示例使您的问题更加清晰。

标签: java jersey


【解决方案1】:

添加一些标志来检查哪种用户登录到自定义主体 impl。然后你可以注入当前用户,然后在你的方法中调用UserTypeAService.findAllUserTypeBService.findAll

@GET
@Path("/path/list")
public String yourMethod(@Context SecurityContext securityContext)

【讨论】:

  • 如果每个用户类型的参数相同,这将是一个很好的选择。但是参数列表有点不同。有没有好的方法来处理它?抱歉,这里对泽西岛很陌生。
  • 您可以使用 post 请求并在带有可选字段或地图的 pojo 中传递参数。或者使用可选的查询参数...
猜你喜欢
  • 1970-01-01
  • 2012-06-23
  • 2015-11-21
  • 2014-10-06
  • 1970-01-01
  • 2014-12-05
  • 2013-07-21
  • 2017-01-26
  • 2011-08-02
相关资源
最近更新 更多