代码之家  ›  专栏  ›  技术社区  ›  Edge7

在jersey中使用外部对象获取响应

  •  0
  • Edge7  · 技术社区  · 8 年前

    我正在用jersey和jetty开发rest api服务。 它非常简单,我有很多这样的端点:

    @GET
    @Path("/username/{username : [a-zA-Z][a-zA-Z_0-9]}")
    @Produces(MediaType.TEXT_PLAIN)
    public String getUsername(@Context UriInfo uriInfo, String content) {
        MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
        String nameParam = queryParams.getFirst("name");
        //Dataset<Row> df = GetDataFrame.getDF();
        return "test";
    }
    

    在getusername方法中,我需要使用在主类中创建的对象。 主课现在是这样的:

    SourceHandler source = new SparkHandler(inputSource);
        source.loadIntoMemory();
    
        Server server = new Server(8080);
        ServletContextHandler ctx =
                new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
    
        ctx.setContextPath("/");
        server.setHandler(ctx);
    
        ServletHolder serHol = ctx.addServlet(ServletContainer.class, "/rest/*");
        serHol.setInitOrder(1);
        serHol.setInitParameter("jersey.config.server.provider.packages",
                "com.ed7.res");
    

    我想在get响应中使用源对象。 在泽西岛有这样做的最佳实践吗? 否则,我将创建另一个带有静态字段/静态方法的类,该方法返回特定对象。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Paul Samsotha    8 年前

    你可以使用 HK2 迪。您可以做的是创建一个独立的 ServiceLocator 并使用 Jersey property .

    public static void main(String... args) {
        SourceHandler source = new SparkHandler(inputSource);
    
        ServiceLocator locator = ServiceLocatorUtilities.bind(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(source).to(SourceHandler.class);
            }
        });
    
        ServletHolder serHol = ctx.addServlet(ServletContainer.class, "/rest/*");
        serHol.setInitParameter(ServletProperties.SERVICE_LOCATOR, locator);
    }
    

    那你就可以 @Inject 这个 SourceHandler 任何你需要的地方

    @Path("whatever")
    public class Resource {
    
        @Inject
        private SourceHandler sourceHandler;
    }
    
    推荐文章