2015-05-18 6 views
1
package firstREST; 

import org.restlet.Application; 
import org.restlet.Component; 
import org.restlet.Restlet; 
import org.restlet.data.Protocol; 
import org.restlet.routing.Router; 

public class Faculty extends Application { 
    public static void main(String[] args) { 
     Component comp = new Component(); 
     comp.getServers().add(Protocol.HTTP, 8080); 
     Application app = new Faculty(); 
     comp.getDefaultHost().attach(app); 
     try { 
      comp.start(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public Restlet createInboundRoot() { 
     Router router = new Router(getContext()); 
     router.attach("/attendance/faculty/select", Faculty_Get.class); 
     router.attach("/attendance/faculty/insert", Faculty_Insert.class); 
     return router; 

    } 
} 

приведенный выше код не работает. после запуска сервера, когда я открываю URL-адрес http://localhost:8080/attendance/faculty/select, он не будет работать. Как я могу сделать эту работу? любой может помочь?Использование маршрутизатора в Rest API - java

Faculty_Get Класс:

package firstREST; 

import org.restlet.resource.Get; 
import org.restlet.resource.ServerResource; 
import org.json.JSONArray; 
import org.json.JSONObject; 
import java.sql.*; 

public class Faculty_Get extends ServerResource { 
    @Get ("json") 
    public String present(String name) throws Exception { 
      // Values. 
      String getName = null; 
      String getPost = null; 
      String getCourse = null; 
      String getDepartment = null; 
      String getPresents = null; 
      String getAbsents = null; 

      // Get values. 
      String jSonString = getQuery().getValues("data"); 

      // Decode jSon. 
      JSONArray mJsonArray = new JSONArray(jSonString); 
      JSONObject mJsonObject = new JSONObject(); 
      for (int i = 0; i < mJsonArray.length(); i++) { 
       mJsonObject = mJsonArray.getJSONObject(i); 
       getName = mJsonObject.getString("name"); 
      } 

      // Database. 
      try 
      { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      Connection myconn = DriverManager.getConnection("jdbc:mysql://localhost:3306/attendance", "root", ""); 
      PreparedStatement ps = myconn.prepareStatement("SELECT * FROM faculty where name = '" + getName + "'"); 
      ResultSet rs = ps.executeQuery(); 
      while(rs.next()) 
      { 
       getName = rs.getString("name"); 
       getPost = rs.getString("post"); 
       getCourse = rs.getString("course"); 
       getDepartment = rs.getString("department"); 
       getPresents = rs.getString("presents"); 
       getAbsents = rs.getString("absents"); 
      } 
      return "name="+getName+"&post="+getPost+"&course="+getCourse+"&department="+getDepartment+"&presents="+getPresents+"&absents="+getAbsents; 
      } 
      catch(Exception e) 
      { 
       throw e; 
      } 
    } 
} 

Ошибка:

May 18, 2015 6:17:10 PM org.restlet.resource.UniformResource doCatch 
WARNING: Exception or error caught in resource 
java.lang.NullPointerException 
    at java.io.StringReader.<init>(Unknown Source) 
    at org.json.JSONTokener.<init>(JSONTokener.java:83) 
    at org.json.JSONArray.<init>(JSONArray.java:145) 
    at firstREST.Faculty_Get.present(Faculty_Get.java:24) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.restlet.resource.ServerResource.doHandle(ServerResource.java:449) 
    at org.restlet.resource.ServerResource.get(ServerResource.java:648) 
    at org.restlet.resource.ServerResource.doHandle(ServerResource.java:530) 
    at org.restlet.resource.ServerResource.doNegotiatedHandle(ServerResource.java:590) 
    at org.restlet.resource.ServerResource.doConditionalHandle(ServerResource.java:302) 
    at org.restlet.resource.ServerResource.handle(ServerResource.java:849) 
    at org.restlet.resource.Finder.handle(Finder.java:513) 
    at org.restlet.routing.Filter.doHandle(Filter.java:159) 
    at org.restlet.routing.Filter.handle(Filter.java:206) 
    at org.restlet.routing.Router.doHandle(Router.java:500) 
    at org.restlet.routing.Router.handle(Router.java:740) 
    at org.restlet.routing.Filter.doHandle(Filter.java:159) 
    at org.restlet.routing.Filter.handle(Filter.java:206) 
    at org.restlet.routing.Filter.doHandle(Filter.java:159) 
    at org.restlet.routing.Filter.handle(Filter.java:206) 
    at org.restlet.routing.Filter.doHandle(Filter.java:159) 
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:154) 
    at org.restlet.routing.Filter.handle(Filter.java:206) 
    at org.restlet.routing.Filter.doHandle(Filter.java:159) 
    at org.restlet.routing.Filter.handle(Filter.java:206) 
    at org.restlet.engine.ChainHelper.handle(ChainHelper.java:114) 
    at org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:75) 
    at org.restlet.Application.handle(Application.java:391) 
    at org.restlet.routing.Filter.doHandle(Filter.java:159) 
    at org.restlet.routing.Filter.handle(Filter.java:206) 
    at org.restlet.routing.Router.doHandle(Router.java:500) 
    at org.restlet.routing.Router.handle(Router.java:740) 
    at org.restlet.routing.Filter.doHandle(Filter.java:159) 
    at org.restlet.routing.Filter.handle(Filter.java:206) 
    at org.restlet.routing.Router.doHandle(Router.java:500) 
    at org.restlet.routing.Router.handle(Router.java:740) 
    at org.restlet.routing.Filter.doHandle(Filter.java:159) 
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:154) 
    at org.restlet.routing.Filter.handle(Filter.java:206) 
    at org.restlet.routing.Filter.doHandle(Filter.java:159) 
    at org.restlet.routing.Filter.handle(Filter.java:206) 
    at org.restlet.engine.ChainHelper.handle(ChainHelper.java:114) 
    at org.restlet.Component.handle(Component.java:391) 
    at org.restlet.Server.handle(Server.java:491) 
    at org.restlet.engine.http.connector.BaseServerHelper.handle(BaseServerHelper.java:161) 
    at org.restlet.engine.http.connector.BaseServerHelper.handleInbound(BaseServerHelper.java:170) 
    at org.restlet.engine.http.connector.BaseHelper.handleNextInbound(BaseHelper.java:421) 
    at org.restlet.engine.http.connector.Connection.readMessages(Connection.java:698) 
    at org.restlet.engine.http.connector.Controller$2.run(Controller.java:98) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

May 18, 2015 6:17:10 PM org.restlet.engine.log.LogFilter afterHandle 
INFO: 2015-05-18 18:17:10 127.0.0.1 - - 8080 GET /attendance/faculty/select - 500 486 0 30 http://localhost:8080 Mozilla/5.0 (Windows NT 6.1; rv:40.0) Gecko/20100101 Firefox/40.0 - 

Это ошибка, я получаю, когда я обновить свой браузер. Я не знаю, что вызывает эту проблему.

+0

Сообщение всей трассировки стека, и 'Faculty_ *' классы –

+0

@Anders Р. Bystrup я отправил выше –

+0

является 'GetQuery(). GetValues ​​("данные")' возвращение что-нибудь? – isalgueiro

ответ

3

Я думаю, что вы могли бы сделать вещи намного проще, и, кроме того, ваше приложение действительно не RESTful ;-) Я твердо думаю, что использование Restlet правильным способом поможет вам исправить вашу проблему. Кажется, что вы используете метод getQuery, тогда как у вас нет строки запроса. Более того, такие параметры запроса, похоже, не применяются в этом случае.

Прежде чем идти дальше, я бы порекомендовал вам взглянуть на эту ссылку для создания веб-API/RESTful-сервиса: https://templth.wordpress.com/2014/12/15/designing-a-web-api/.

Вот комментарии я бы относительно кода вы предоставили свои вопросы:

  • Вы должны использовать один ресурс для списка ресурсов и один для одного ресурса. Так что я бы что-то вроде этого:

    @Override 
    public Restlet createInboundRoot() { 
        Router router = new Router(getContext()); 
        router.attach("/attendance/faculty/{name}", FacultyServerResource.class); 
        router.attach("/attendance/faculty/", FacultyListServerResource.class); 
        return router; 
    } 
    

    Это не RESTful использовать имена операций (как select или insert) в пределах пути ресурсов. Вы должны использовать существующие методы HTTP для своих нужд.

    Токен {name} соответствует переменной пути. Это означает, что подключенный серверный ресурс будет вызываться независимо от значения. Например, будут совпадать URL-адреса, такие как /attendance/faculty/facultyName1 или /attendance/faculty/facultyName2. Кроме того, Restlet автоматически установит значение в атрибуте name. Для URL # 1 имя - facultyName1, а для URL # 2 - facultyName2.

    Строка, которую вы предоставляете в качестве первого параметра метода attach, можно рассматривать как своеобразное регулярное выражение.

  • Вы должны использовать переменную пути, чтобы указать критерий (название факультета) для загрузки вашей способности. См. Элемент {name} в пути ресурса /attendance/faculty/{name}. Restlet позволит вам получить просто этот намек с помощью API. Поэтому я хотел бы адаптировать код вашего ресурса сервера, как описано ниже:

    public class FacultyServerResource extends ServerResource { 
        @Get ("json") 
        public String present() throws Exception { 
         String facultyName = (String)getAttribute("name"); 
         (...) 
        } 
    

    В качестве напоминания, указав значение json в аннотации Get позволяет конфигурационное согласование содержания и говорит, что этот метод будет использоваться только в случае, если клиент хочет получить контент JSON.

  • Вы должны работать с bean-компонентом в серверном ресурсе относительно возвращаемого содержимого. Вы можете просто вернуть его из своего метода present.От вашего кода, я хотел бы создать боб подобное:

    public class Faculty { 
        private String name; 
        private String post; 
        private String course; 
        private String department; 
        private List<String> presents; 
        private List<String> absents; 
        // Getters and setters 
        (...) 
    } 
    

    и обновить метод present:

    @Get ("json") 
    public Faculty present() throws Exception { 
        (...) 
        Faculty faculty = new Faculty(); 
        faculty.setName("..."); 
        faculty.setPost("..."); 
        (...) 
        return faculty; 
    } 
    

    сделать работу такой подход, вам просто нужно добавить расширение org.restlet.ext.jackson (и его зависимости) в вашем пути к классу.

  • Что-то, чего я не понимаю в классе ресурсов сервера, - это то, почему вы используете метод getQuery. Последнее сделано для получения подсказок из параметров запроса и обычно должно использоваться с такими URL-адресами: /attendance/faculty/facultyName?param1=something&param2=somethingelse. Вы получите значения параметров, как это:

    String param1Value = getQuery().getValues("param1"); 
    // or 
    String param2Value = getQueryValue("param2"); 
    

    В вас случае, это будет нулевым, так как у вас нет запроса параметров строки/запроса. Я не понимаю цели вашего параметра запроса data.

  • Еще одна вещь, которую вы должны принять во внимание, - использовать пул соединений, поскольку создание JDBC-соединения с базой данных неэффективно в веб-среде. Кроме того, вы не можете ограничить количество открытых соединений. Существуют такие инструменты, как DBCP или C3P0, которые обеспечивают такую ​​функцию.

Надеюсь, это поможет вам и не стесняйтесь спрашивать меня, если что-то непонятно! Тьерри

+0

спасибо большое. Я все еще не понял этого: 'router.attach ("/attendance/faculty/{name} ", FacultyServerResource.class),' как это действительно работает. не могли бы вы дать мне демо-версию или что-то или объяснить подробно? –

+0

Добро пожаловать! Я обновил свой ответ относительно оставшегося вопроса. Надеюсь, что это яснее ... –

+0

Вам будет интересен простой пример проекта? –

Смежные вопросы