这是我的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。我在这做错了什么。任何帮助表示赞赏。
答案 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在部署时没有爆炸,这也会起作用,并且它不依赖于服务器的工作目录来查找数据文件。或者,如果您应该访问外部文件,则将其(绝对)路径设置为上下文参数,并获取该路径而不是对其进行硬编码。