有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

restlet中的java“找不到(404)”错误

我不熟悉restlet框架。 我创建了一个小的JavaEE应用程序,但它给了我一个错误“Not Found(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)

谢谢


共 (2) 个答案

  1. # 1 楼答案

    谢谢河马
    实际上问题出在url上
    我不得不修改下面的行

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

    进入这条线

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

    如果您使用用于JavaSE的restlet框架,那么第一个url就可以了。但对于web应用程序(JavaEE),必须使用服务器的相对路径

    再次感谢你的帮助

  2. # 2 楼答案

    除了发表评论外,您是如何启动Restlet应用程序的?使用服务器类,如下所示:

    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应用程序,也许您使用了servlet扩展?在这种情况下,还可以考虑servlet级别的映射

    使用第一种方法,我让你的应用程序与org一起工作。restlet。jar和org。restlet。ext.xml。jar(2.0.5版,jee版)。我使用urlhttp://localhost:8084/accounts/10/mails/1访问了它

    希望对你有帮助。 蒂埃里