[英]Java Spring + Jersey subresource: inject constructor-arg at runtime
我定义了以下方法,返回一个表示子资源定位器(泽西岛)的 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);
}
pageResource
具有在applicationContext.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
,并通过它解析子资源实例。
当子资源定位器方法要返回受管资源类的实例时,可以利用资源上下文。 此类实例将在声明的范围内注入和管理,就像根资源类的实例一样。
如上所述,您可以获得子资源类的实例,并且所有注入都将被处理
@Path("root")
public class Resource {
@Context
ResourceContext context;
@Path("sub/{id}")
public SubResource get() {
return context.getResource(SubResource.class);
}
}
@PathParam
s 也被解析为注入到您的子资源实例中。 所以你可以这样做
class SubResource {
@Autowired
Service service;
@PathParam("id")
long id;
}
当子资源实例被解析时,它将被注入服务和路径参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.