Java Spring + Jersey子资源:在运行时注入constructor-arg

时间:2016-07-18 03:59:08

标签: java spring jersey

我定义了以下方法,返回一个代表子资源定位器(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中定义了原型范围。

问题:在运行时传递构造函数arg时,将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(); 
    }
} 

1 个答案:

答案 0 :(得分:3)

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

  

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

如上所述,您可以获取子资源类的实例,并且将处理所有注入

@Path("root")
public class Resource {

    @Context
    ResourceContext context;

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

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

class SubResource {

    @Autowired
    Service service;

    @PathParam("id")
    long id;
}

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