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

Java 使用jersey servlet容器访问Web INF文件夹,java,tomcat,jersey,Java,Tomcat,Jersey,我试图访问WEB-INF文件夹中的内容,并将该文件用于我的JAXB解组功能,但我尝试了所有方法,但都没有成功。 首先,我使用jersey和grizzly服务器在本地测试它,但现在我想将它移动到tomcat服务器上,并使用一个.war文件部署它,该文件包含WEB-INF文件夹和index.html 我有3个包(资源、模型和主包)。哪一个是我的资源所在。 在其中一个(模型)中,我有一个类,我正在使用这个解组函数对WEB-INF文件夹中的一个文件进行解组,这个类由参考资料中的一个类调用 如何访问WEB

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

我有3个包(资源、模型和主包)。哪一个是我的资源所在。
在其中一个(模型)中,我有一个类,我正在使用这个解组函数对WEB-INF文件夹中的一个文件进行解组,这个类由参考资料中的一个类调用

如何访问WEB-INF中的文件

编辑-它不是内置在servlet类中的,让我进一步解释一下。 我正在使用jaxrs和jersey创建一个restful api

Catalogo类(它是映射到url的资源)

然后,catalogo内部使用的CatalogoDAO类位于models包中

    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;
    }
}
但仍然没有成功

添加我的get请求和文件夹结构的图像。 第一个图像显示异常,表示该文件不存在,但正如您所看到的,第二个图像证明它存在,并显示.war扩展之前我的tomcat服务器中的文件夹结构

类型异常报告

消息java.lang.NullPointerException

说明服务器遇到阻止它的内部错误 不履行这一要求

例外情况

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)

根本原因

java.lang.NullPointerException br.unicamp.ft.courseviewer.modelo.CatalogoDAO.open(CatalogoDAO.java:22) br.unicamp.ft.courseviewer.resource.CatalogoResource.ReturnaCatalogo(CatalogoResource.java:24) sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) sun.reflect.NativeMethodAccessorImpl.invoke(未知源) sun.reflect.DelegatingMethodAccessorImpl.invoke(未知源) java.lang.reflect.Method.invoke(未知源) org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151) org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171) org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutingVoker.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$1.run(ServerRuntime.java:259) org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) org.glassfish.jersey.internal.Errors$1.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类中执行了此操作:

@Context ServletContext context;
这告诉JAX-RS,在实例化类之后,它应该注入ServletContext。因此,只需将此上下文传递给DAO构造函数或方法:

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

您可以查看一下@dsp\u user,IDE无法识别ServletContext类@dsp_用户我从servelt api导入了它,并进行了编辑。试着看一下,那代码到底出了什么问题?您得到了什么样的例外?非常感谢您,对于问题进展过程中出现的任何问题,我深表歉意。
 public Catalogo open(ServletContext context, int ano, int curso) throws URISyntaxException {
    try {           
        InputStream resourceAsStream = context.getResourceAsStream("/WEB-INF/catalogos/2012_36.xml"); 
        // ...