代码在Java Application中工作正常但在服务器上抛出NullPointerException

时间:2016-04-01 20:48:06

标签: java jersey

这是我的DataService对象。

public class DataService {

    private final String path = "src/main/resources/DataSource/data1.txt";

    private ArrayList<Person> _personList;
    private ArrayList<Course> _courseList;
    private QueryHandler _handler;

    public DataService() throws ParseException, JSONException, IOException {

        _personList = new ArrayList<>();
        _courseList = new ArrayList<>();
        String jsonData = Reader.readFile(path);

        JSONParser.read(jsonData, _courseList, _personList);

        _handler = new QueryHandler(_personList, _courseList);

    }
    public QueryHandler get_handler() {
        return _handler;
    }


}

当我在调用者函数中调用它时,它以下方式正常工作并返回所需的数据。

public class Caller {

    public static void main(String[] args) throws IOException {

        DataService service = null;
        try {
            service = new DataService();
        } catch (JSONException | ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ArrayList<Course> clist = service.get_handler().getAllCourses();


        clist.forEach(course -> System.out.println(course.toString()));

    }
}

现在,当我尝试将其称为WebService时,就会以这种方式引发一连串的错误。

@Path("/courses")
public class CourseService {

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public ArrayList<Course> getAllCourses(){
        DataService service = null;
        try {
            service = new DataService();
        } catch (JSONException | ParseException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        return service.get_handler().getAllCourses();
    }
}

这是我遇到的错误,

javax.servlet.ServletException: java.lang.NullPointerException
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:489)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.NullPointerException
    Service.CourseService.getAllCourses(CourseService.java:30)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:497)
    org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
    org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144)
    org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161)
    org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205)
    org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
    org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
    org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
    org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
    org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
    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:317)
    org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
    org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我的项目使用jersey来创建REST API。我在这做错了什么。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

我猜你的问题就在这一行:

private final String path = "src/main/resources/DataSource/data1.txt";

如果您在IDE中运行代码而不是在应用程序服务器中运行代码,则此方法有效 - 因为您实际上没有src / main / resources文件夹。

尝试加载你的txt文件:

Thread.currentThread().getContextClassLoader().getResourceAsStream("DataSource/data1.txt");

答案 1 :(得分:0)

假设没有报告先前的异常(即通过CourseService.java的第28行),当执行到达发生错误的行时,您可以确信service不是null

return service.get_handler().getAllCourses();

。在这种情况下,必须是service.get_handler()返回null的情况。但DataHandler.getService()如果成功完成,则返回DataHandler构造函数明确设置为非空的值,并且该值在以后不会被修改。

因此,我们必须得出结论DataService构造函数失败,并且在提供的catch块中捕获了生成的异常。您作为结果打印的堆栈跟踪可能会很有启发性,但您还没有提供它。可能它会转到与您呈现的堆栈跟踪发送的输出流不同的输出流。

我在这一点上观察到你对这种例外的处理是有缺陷的。如果您无法实例化DataService,那么您的方法无法成功继续,因此捕获异常并继续进行是不合适的。如果您不想声明所有可能的异常,那么您可以改为定义一个自定义异常类型来包装(并抛出)此类异常,否则您可以使用ServletException来实现此目的。

至于为什么构造函数可能会失败,我重申我对评论的观察:

  

初始化DataService.path的值看起来非常可疑。它是一个相对路径,因此取决于工作目录,这不一定是您的想法。实际上,可以想象目标文件甚至根本没有打包到您的webapp中。

除了打开文件之外,您可能还有更好的运气,确保将所需文件打包到您可以确定将在webapp的类路径中的某个位置,并使用上下文ClassLoader&# 39; s getResourceAsStream()方法获取InputStream从中读取其内容的方法。除此之外,即使您的WAR在部署时没有爆炸,这也会起作用,并且它不依赖于服务器的工作目录来查找数据文件。或者,如果您应该访问外部文件,则将其(绝对)路径设置为上下文参数,并获取该路径而不是对其进行硬编码。