我的一个项目有问题。以下是关于它的更多信息:
我们的老师给了我们一个包含hadoop和hbase的虚拟机(ubuntu),已经安装好了。目标很简单:我们有一个 Rest api
与 tomcat 8.5
(restserver项目,web项目),其中 GET
请求(老师只希望我们 GET
请求,显然是安全原因),我们需要执行,根据 url
(例如: /students/{id}/{program}
将返回hbase表中此特定学生(id)和学习年份(计划)的成绩摘要、数据选择和mapreduce作业。我们有一个bigdata项目,它包含简单的java代码来扫描和过滤 Hbase
table。这是这个项目的简短摘要。
这是我们用于这个项目的结构:项目结构
下面是执行逻辑:我们输入 url
在浏览器中,在我们启动restserver项目之后( right click on RestServer
-> Run as
-> Run on server
. 这样做之后我们得到的是:浏览器中的restserver。
简单的部分到此为止。我们在前面的图片上看到的链接只是演示,他们不是我们在这个项目中需要做的。我们的想法是拦截 GET
来自api的请求,在处理请求的方法中,获取参数,将它们提供给响应对象的构造函数调用,并将对象作为响应返回(将转换为 JSON
). 我们的想法是得到这个对象(对我们的 GET
请求)。所以我们需要让这两个项目沟通。
以下是拦截请求的代码:
@GET
@Path("/students/{id}/{program}")
@Produces(MediaType.APPLICATION_JSON)
public Response getStudent(@PathParam("id") String ID,@PathParam("program") String program) throws IOException {
System.out.println("ID : "+ID+" program"+program);
if (ID != null) {
System.out.println("Non nul");
return Response.ok(new Response1(ID,program), MediaType.APPLICATION_JSON).build();
} else {
return Response.status(Response.Status.NOT_FOUND).entity("Student not found: " + ID).build();
}
}
这个 Response1(ID,program)
对象是在bigdata项目中生成的。当我直接从bigdata项目执行代码时(如 Java application
),我绝对没有问题,没有错误。但是这个想法是使用bigdata项目的代码来构建 Result1
对象,并将其“返回”给 Rest api
. 问题就在这里,我尝试了我所知道的一切,在互联网上找到的,但我不能解决这个问题。当我键入我的url时,(即: http://localhost:8080/RestServer/v1/StudentService/students/2005000033/L3
)我得到这个错误:错误
从我的研究中,我发现(如果我错了请纠正我)程序找不到 ByteArrayComparable
上课时间 runtime
. 我查看了所有能找到的链接,以下是我试图解决的问题:
检查hadoop和hbase库是否都在这两个项目中。
检查项目是否包含 hbase-client
,它应该包含 ByteArrayComparable
类(是的,两个项目中都有)。
通过做 right click
在restserver上-> Properties
-> Java Build Path
: Source
选项卡:我添加了 src
bigdata项目的文件夹(和 bin
文件夹,但我不记得在哪里,我相信它是在一个标签的 Java Build Path
). Projects
tab:我添加了bigdata项目。 Order and Export
我查过了 src
文件夹(此文件夹位于restserver项目中,在我添加 src
中bigdata项目的文件夹 Source
选项卡)。 Deployement Assembly
:我添加了bigdata项目。
我把bigdata项目中使用的类复制到我的 src
我的restserver项目的文件夹。
我发现这可能是由于库之间的冲突造成的,所以我尝试在一个项目中删除一些库,然后在另一个项目中使用它们。
在每次更改之间,我清理并重建了项目。
我尝试通过添加 import org.apache.hadoop.hbase.filter.*;
在涉及执行的文件中。
我不知道我现在能做什么。我的一些朋友也有同样的问题,即使我们没有相同的代码,所以问题似乎来自配置。在这一点上,我没有执行任何mapreduce工作,我只是使用 Hbase java api
用一些过滤器扫描表。
谢谢你读我的文章,我希望我能找到答案。我将继续测试和搜索,并编辑这篇文章,如果我发现一些东西。
这是密码 Response1
班级:
package bdma.bigdata.project.rest.core;
import java.io.IOException;
import org.apache.hadoop.hbase.filter.Filter.*;
public class Response1 {
private StudentBD student;
private Semester semesters;
public Response1(String id, String program) throws IOException {
System.out.println("Building student");
this.student = new StudentBD(id);
System.out.println("Building semester");
this.semesters = new Semester(id,program);
}
@Override
public String toString() {
return student.toString()+" "+semesters.toString();
}
public static void main(String[] args) throws IOException {
Response1 r = new Response1("2005000100", "L1");
System.out.println("AFFICHAGE TEST");
System.out.println(r);
}
}
编辑
我终于设法解决了我的问题。我把解决办法放在这里,如果它能在未来帮助和我处境相同的人。一旦你链接了你的两个项目(在 Java Build Path
属性的一节 Rest api
项目),您需要继续,仍然在属性中,在部署程序集中(如上所述) Java Build Path
). 点击这里 Add...
并添加所有jar文件。
暂无答案!
目前还没有任何答案,快来回答吧!