使用 jersey servlet 容器访问 Web-INF 文件夹

Access Web-INF folder using jersey servlet container

我正在尝试访问 WEB-INF 文件夹中的内容并将该文件用于我的 JAXB 解组函数,但我已经尝试了所有方法但没有成功。 首先,我使用 jersey 和 grizzly 服务器在本地测试它,但现在我想将它移动到 tomcat 服务器并使用具有 WEB-INF 的 .war 文件部署它文件夹和 index.html。

我有 3 个包(资源、模型和主包)。哪一个是我的资源。
在其中一个(模型)中,我有一个 classe,我正在将这个解组函数用于 WEB-INF 文件夹中的一个文件,这个 class 被 class 里面的资源。

如何访问WEB-INF中的文件?

编辑 - 它没有内置到 servlet class 中,让我再解释一下。 我正在使用 jaxrs 和球衣创建 restful api。

目录 Class(它是映射到 url 的资源)。

@Path("catalogo")
public class CatalogoResource {
    @Context ServletContext context;


    @Path("{id}/{ano}")
    @GET
    @Produces(MediaType.APPLICATION_XML)
    public Catalogo retornaCatalogo(@PathParam("id") int id, @PathParam("ano") int ano) throws URISyntaxException, MalformedURLException{
        //buscar no arquivo, dar unmarshall pra ca.
        Catalogo cat = new CatalogoDAO().open(ano, id);
        //pensar em como retornar o xml;
        return cat;
    }

}

然后,在目录中使用的 class CatalogoDAO,它在模型包中。

    public class CatalogoDAO{
    private Catalogo catalog = new Catalogo();
    ServletContext context;

    public Catalogo open(int ano, int curso) throws URISyntaxException {
        try {           
            InputStream resourceAsStream = context.getResourceAsStream("/WEB-INF/catalogos/2012_36.xml"); //line of the null pointer.
            JAXBContext jaxbContext = JAXBContext.newInstance(Catalogo.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            catalog = (Catalogo) jaxbUnmarshaller.unmarshal(resourceAsStream);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
     return catalog;
    }
}

但是还是没有成功。

正在添加我的获取请求的图像和文件夹结构。 第一张图片显示异常说明该文件不存在,但如您所见,第二张图片证明它存在并显示 .war 扩展之前我的 tomcat 服务器内的文件夹结构。

type Exception report

message java.lang.NullPointerException

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: java.lang.NullPointerException org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:392) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:382) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:345) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:220) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

root cause

java.lang.NullPointerException br.unicamp.ft.courseviewer.modelo.CatalogoDAO.open(CatalogoDAO.java:22) br.unicamp.ft.courseviewer.resource.CatalogoResource.retornaCatalogo(CatalogoResource.java:24) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.invoke(ResourceMethodInvocationHandlerFactory.java:81) org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.run(AbstractJavaResourceMethodDispatcher.java:151) org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171) org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195) org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104) org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:402) org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:349) org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:106) org.glassfish.jersey.server.ServerRuntime.run(ServerRuntime.java:259) org.glassfish.jersey.internal.Errors.call(Errors.java:271) org.glassfish.jersey.internal.Errors.call(Errors.java:267) org.glassfish.jersey.internal.Errors.process(Errors.java:315) org.glassfish.jersey.internal.Errors.process(Errors.java:297) org.glassfish.jersey.internal.Errors.process(Errors.java:267) org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:318) org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236) org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1010) org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:382) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:345) org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:220) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

好的。所以堆栈跟踪显示:

 java.lang.NullPointerException  
 br.unicamp.ft.courseviewer.modelo.CatalogoDAO.open(CatalogoDAO.java:22)

因此,在第 22 行,即

InputStream resourceAsStream = context.getResourceAsStream("/WEB-INF/catalogos/2012_36.xml");

你得到一个 NullPointerException。

这意味着上下文为空。

为什么为空?

因为你从来没有初始化过它。它只是您对象的一个​​字段,从未被任何人初始化。

您如何获得对 ServletContext 的引用?

您已经在 CatalogoResource 中这样做了 class:

@Context ServletContext context;

这告诉 JAX-RS,在实例化 class 之后,它应该注入 ServletContext。所以,只需将此上下文传递给您的 DAO 构造函数或方法:

 public Catalogo open(ServletContext context, int ano, int curso) throws URISyntaxException {
    try {           
        InputStream resourceAsStream = context.getResourceAsStream("/WEB-INF/catalogos/2012_36.xml"); 
        // ...