使用jersey servlet容器

时间:2015-12-31 17:56:21

标签: java tomcat jersey

我正在尝试访问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)

enter image description here

1 个答案:

答案 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"); 
        // ...