当前位置: 首页 > 面试题库 >

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

胥康安
2023-03-14
问题内容

我定义了以下方法,返回一个代表子资源定位器(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); 
}

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(); 
    }
}

问题答案:

您可以做的是inject
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;
}

子资源实例解析后,将注入服务和路径参数。



 类似资料:
  • 免责声明:我刚刚开始使用OSGI,所以请忍受我和我的知识不足... 为了本练习,假设我有一个基于泽西岛 (2.17.0) 的 REST 应用程序在 OSGI 环境中的 Jetty (9.2.10) 下运行,它为用户提供了一些通过 SOAP 从单独的服务器收集的统计信息。 我现在尝试在另一个应用程序中重用一些现有代码,该应用程序应该通过JMS(或其他东西)检索统计信息。 我的目的是在捆绑包中为客户端

  • 将EntityManager注入资源可以工作,但不能注入Callable。在这里,EntityManager保持。 请告知代码保存在这里是否比保存在GitHub上更好。

  • 我正在使用Dropwizard 8.2.0构建REST服务。我有2个资源:FolderResource和FileResource: 我做错了什么?

  • 我正在使用Jersey 2.8和Glassfish 4.0。我有一个资源定位器类,如下所示 问题是,当通过ResourceContext获得MySubService时,EJB没有注入其中。 以前,我使用Glassfish 3和Jersey 1.17以及专有的ResourceContext,完全相同的代码可以正常工作。 我在谷歌上搜索了很多,读到了很多类似(但有点不同)的问题,据我所知,当通过Res

  • 我正在泽西岛应用程序中使用 CDI。在根资源上,CDI 注入按预期工作,但每当我返回子资源时,CDI 注入源都不可用。 具有子资源定位器的根资源: 子资源: 错误: 我正在使用和Weld依赖项,在Undertow上运行,并将Weld servlet侦听器添加到部署中。 同样,对根资源的相同注入确实有效。< code>@Named("name ")字符串由< code>@ApplicationSco

  • 起初,在我的web服务器中,我只有一个REST servlet。类似于: 和web.xml: 但是后来我想向服务器添加一些静态html,所以我将servlet映射更新为/rest/* 控制器servlet类的@path指令从“/”到“/rest”。一切都很好,但是controller的子资源或方法与@path指令停止工作…IE: null 我使用了trace util,得到了以下结果: 对于/[a