У меня проблема с одним из моих проектов. Вот немного больше информации об этом:
Наш учитель дал нам виртуальную машину (ubuntu), которая содержит Had oop и Hbase , уже настроенные. Цель довольно проста: у нас есть Rest api
с tomcat 8.5
( RestServer проект, веб-проект), который перехватывает GET
запросов (наш учитель хочет, чтобы у нас был только GET
запрос, безопасность очевидно, причина), и мы должны выполнить, в соответствии с url
(например: /students/{id}/{program}
вернет сводку оценок для данного конкретного учащегося (id) и год обучения (программы)), выбор данных и картографическое задание на Hbase таблицы. И у нас есть проект BigData , который содержит простой код java для сканирования и фильтрации Hbase
таблицы. Вот краткая сводка проекта.
Вот структура, которую мы используем для этого проекта: структура проекта
А вот какова логика выполнения c : мы набираем наш url
в браузере, после того как запустили наш проект RestServer (right click on RestServer
-> Run as
-> Run on server
. Вот что мы получаем после этого: RestServer в браузере .
Легкая часть на этом останавливается. Ссылки, которые мы видим на предыдущем изображении, предназначены только для демонстрации, они не являются тем, что нам нужно сделать в этом проекте. Идея состоит в том, чтобы перехват запрос GET
от API в методе, обрабатывающем запрос, получает параметры, передает их вызову конструктора нашего объекта ответа и возвращает объект в качестве ответа (который будет преобразован в JSON
Идея состоит в том, чтобы получить этот объект (ответ на наш запрос GET
) из проекта BigData . Поэтому нам нужно заставить эти 2 проекта взаимодействовать.
Вот код перехватить запрос:
@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
и «вернуть его» * 1053 *. Проблема здесь, я попробовал абсолютно все, что я знаю и нашел на inte rnet, но я не могу решить эту проблему. Когда я набираю свой URL (то есть: http://localhost:8080/RestServer/v1/StudentService/students/2005000033/L3
), я получаю эту ошибку: ошибка
Из моего исследования я обнаружил, что (исправьте меня, если я ошибаюсь) программа не могу найти класс ByteArrayComparable
в runtime
. Я просмотрел все ссылки, которые смог найти, и вот что я пытался решить:
- Проверьте, есть ли в библиотеке 1147 * и Hbase находятся в обоих проектах.
- Проверьте, содержит ли проект
hbase-client
, который, как предполагается, содержит класс ByteArrayComparable
(да, он есть в обоих проектах). - Делая
right click
на RestServer -> Properties
-> Java Build Path
: Source
вкладка: я добавил папку src
из BigData проекта (и Папка bin
, но я не могу вспомнить, где, по-моему, она находится на одной из вкладок Java Build Path
). Projects
вкладка: я добавил проект BigData . Order and Export
вкладка: я проверил папку src
(эта папка находится в проекте RestServer , созданном после добавления папки src
из BigData проект во вкладке Source
).
Deployement Assembly
: я добавил BigData проект. - Я скопировал используемый класс в проекте BigData в моем * 111 3 * папка моего 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);
}
}
Редактировать
Мне наконец удалось решить мою проблему. Я положил решение здесь, если оно может помочь кому-то в той же ситуации, что и я, в будущем. После того, как вы связали свои 2 проекта (в разделе Java Build Path
свойств проекта Rest api
), вам нужно go, все еще в свойствах, в Deployment Assembly (выше Java Build Path
). Здесь вы нажимаете Add...
и добавляете все свои файлы jar.