【问题标题】:Java Spring + Jersey subresource: inject constructor-arg at runtimeJava Spring + Jersey 子资源:在运行时注入 constructor-arg
【发布时间】:2016-07-18 03:59:08
【问题描述】:

我定义了以下方法,返回一个表示子资源定位器(Jersey)的bean:

@Path("{slug}")
public PageResource page( 
        @PathParam("slug") String siteSlug) throws AppException { 

    siteService.getSiteBySlug(siteSlug); //Validate if exists, else throw error 

    return (PageResource) appContext.getBean("pageResource", siteSlug); 
}

pageResourceapplicationContext.xml 中定义了原型范围。

问题:将 bean 注入当前类,同时在运行时传递构造函数参数的替代方法是什么?
我不习惯从应用程序上下文中显式获取 bean。

编辑@peeskillet:

子资源:

public class PageResource {
    @Autowired
    IPageService pageService; 

    String siteSlug; 

    public void setPageService(IPageService pageService){
        this.pageService = pageService; 
    }

    public PageResource(){}

    public PageResource(String siteSlug){ //***Inject siteSlug from parent here***
        this.siteSlug = siteSlug; 
    }; 

    @POST
    @Path("/pages")
    @Consumes({ MediaType.APPLICATION_JSON })
    @Produces({ MediaType.APPLICATION_JSON })
    public Response createPage(@NotNull @Valid Page page) throws AppException{ 
        System.out.println(pageService);
        ObjectId pageId = pageService.createPage(page); 
        page.setId(pageId); 

        return Response
                .status(Response.Status.CREATED)// 201 
                .entity(page)
                .header("Location", 
                        "http://localhost:8000/zwoop-v001/sites/" + this.siteSlug + 
                        "/pages/" + page.getSlug()).build(); 
    }
} 

【问题讨论】:

  • 尝试将ResourceContext注入主资源类并在定位器方法中返回context.getResource(PageResource.class)
  • @peeskillet 抱歉回复晚了。我需要能够将参数传递给子资源类构造函数。
  • 如果您正确配置了与 Jersey 的 Spring 集成,即您能够将 Spring bean 注入 Jersey 资源,那么使用上述方法也应该可以很好地注入子资源。
  • 除此之外,你在谈论什么论点?只是要注入的 bean,还是其他一些参数?
  • @peeskillet 我的意思是将参数从父类传递给子资源的构造函数(如上例中的siteSlug)。这里的问题是资源需要在运行时调用,即在请求期间,所以我不能预先定义构造函数参数。

标签: java spring jersey


【解决方案1】:

你可以做的是注入ResourceContext,并通过它解析子资源实例。

当托管资源类的实例将由子资源定位器方法返回时,可以使用资源上下文。此类实例将在声明的范围内注入和管理,就像根资源类的实例一样。

如前所述,您可以获得子资源类的实例,所有的注入都会被处理

@Path("root")
public class Resource {

    @Context
    ResourceContext context;

    @Path("sub/{id}")
    public SubResource get() {
        return context.getResource(SubResource.class);
    }
}

@PathParams 也被解析为注入到您的子资源实例中。所以你可以这样做

class SubResource {

    @Autowired
    Service service;

    @PathParam("id")
    long id;
}

当子资源实例被解析时,它会被注入服务和路径参数。

【讨论】:

  • 有没有办法做到这一点,而子资源不必知道 PathParam 变量的名称?这是迄今为止我发现的最好的例子,但它仍然将根资源与其所有可传递子资源结合起来,并且需要复制 @PathParam 的参数(我想避免它的一种方法是创建一个常量)
  • 您需要使用某种设置方法自己手动设置。如果没有声明,Jersey 就不可能知道注入什么。
猜你喜欢
  • 2014-06-27
  • 2015-05-16
  • 2011-12-20
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多