我正在尝试访问WEB-INF文件夹中的内容并将该文件用于我的JAXB解组函数,但我已经尝试了所有内容而没有成功。 首先,我使用泽西和灰熊服务器在本地测试它,但现在我想将它移动到tomcat服务器,我使用.war文件部署它,该文件具有WEB-INF文件夹和index.html。
我有3个包(资源,模型和主包)。哪一个是我的资源。
在其中一个(模型)中,我有一个classe,我正在使用这个解组函数到WEB-INF文件夹中的一个文件,这个类是由资源内的类调用的。
如何访问WEB-INF中的文件?
编辑 - 它没有内置到servlet类中,让我再解释一下。 我正在使用jaxrs和jersey创造一个宁静的api。
Catalogo 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;
}
}
,而不是在catalogo中使用的类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服务器内的文件夹结构。
输入例外报告
message java.lang.NullPointerException
description服务器遇到阻止它的内部错误 完成此请求。
例外
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.retornaCatalogo(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 $ 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 $ 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)
答案 0 :(得分:2)
行。所以堆栈跟踪说:
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");
// ...