Ошибка "Не найдено" (404) в рестлете

Я новичок в структуре рестлета. Я создал небольшое приложение java ee, но оно выдает ошибку «Не найдено (404)»

public class MailServerApplication extends Application {
   @Override
   public Restlet createInboundRoot() {
      Router router = new Router(getContext());
      router.attach("http://localhost:8084/accounts/{accountId}/mails/{mailId}", MailServerResource.class);
      return router;
   }
}

////////////////////////////////
public class MailServerResource extends ServerResource {
   @Override
   protected Representation get() throws ResourceException {

      DomRepresentation result = null;
      try {
         result = new DomRepresentation();
         result.setIndenting(true);
         Document doc = result.getDocument();
         Node mailElt = doc.createElement("mail");
         doc.appendChild(mailElt);
         Node statusElt = doc.createElement("status");
         statusElt.setTextContent("received");
         mailElt.appendChild(statusElt);
         Node subjectElt = doc.createElement("subject");
         subjectElt.setTextContent("Message to self");
         mailElt.appendChild(subjectElt);
         Node contentElt = doc.createElement("content");
         contentElt.setTextContent("Doh!");
         mailElt.appendChild(contentElt);
      } catch (IOException e) {
      }
      return result;
   }
   @Override
   protected Representation put(Representation representation) throws ResourceException {
      DomRepresentation mailRep = new DomRepresentation(representation);
      Document doc;
      try {
         doc = mailRep.getDocument();
         Element mailElt = doc.getDocumentElement();
         Element statusElt = (Element) mailElt
         .getElementsByTagName("status").item(0);
         Element subjectElt = (Element) mailElt.getElementsByTagName(
         "subject").item(0);
         Element contentElt = (Element) mailElt.getElementsByTagName(
         "content").item(0);
         Element accountRefElt = (Element) mailElt.getElementsByTagName(
         "accountRef").item(0);
         System.out.println("Status: " + statusElt.getTextContent());
         System.out.println("Subject: " + subjectElt.getTextContent());
         System.out.println("Content: " + contentElt.getTextContent());
         System.out.println("Account URI: " + accountRefElt.getTextContent());
      } catch (IOException e) {
         throw new ResourceException(e);
      }
      return null;
   }
}

но если я запускаю / отлаживаю его. это дает следующую ошибку:

Exception in thread "main" Not Found (404) - Not Found
        at org.restlet.resource.ClientResource.handle(ClientResource.java:858)
        at org.restlet.resource.ClientResource.handle(ClientResource.java:763)
        at org.restlet.resource.ClientResource.get(ClientResource.java:496)
        at MailClient.main(MailClient.java:19)

Благодарю.


person user619237    schedule 20.04.2011    source источник
comment
Эта ошибка означает, что страница сервера не может быть найдена. Вы уверены, что ввели правильный URL и что он доступен?   -  person AbdullahC    schedule 20.04.2011
comment
Какой URL вы используете для доступа к нему? Кроме того, ваш router.attach() вызов, вероятно, не должен указывать все, что связано с host: port. Вместо этого попробуйте использовать только router.attach("/accounts/{accountId}/mails/{mailId}").   -  person Brian Kelly    schedule 21.04.2011


Ответы (2)


Помимо опубликованных комментариев, как вы запустили приложение Restlet? Используя класс Server, как показано ниже:

public class MailServerApplication extends Application {
  (...)
  public static void main(String[] args) {
    try {
      Server server = new Server(Protocol.HTTP, 8084);
      server.setNext(new MailServerApplication());
      server.start();

      System.out.println("Press a key to stop");
      System.in.read();
    } catch(Exception ex) {
      ex.printStackTrace();
    }
  }
}

Как вы сказали, вы разрабатываете приложение JavaEE, возможно, вы использовали расширение сервлета? В этом случае также может учитываться отображение на уровне сервлета.

При первом подходе я заставил ваше приложение работать с org.restlet.jar и org.restlet.ext.xml.jar (версия 2.0.5, jee edition). Я получил к нему доступ, используя URL-адрес http://localhost:8084/accounts/10/mails/1.

Надеюсь, это поможет тебе. Тьерри

person Thierry Templier    schedule 21.04.2011

привет, спасибо бегемоту.
на самом деле проблема была в URL-адресе.
мне пришлось изменить следующую строку

     router.attach("http://localhost:8084/accounts/{accountId}/mails/{mailId}", MailServerResource.class);

в эту строку.

     router.attach("/accounts/{accountId}/mails/{mailId}", MailServerResource.class);

если вы используете структуру рестлета для JavaSE, тогда первый URL-адрес был в порядке. но для веб-приложения (java ee) вы должны использовать относительный путь к серверу.

В очередной раз благодарим за помощь.

person user619237    schedule 21.04.2011