2013-05-06 30 views
5

stworzyłem wiele tras za pomocą tego kodu z elementów.Kiedy używać Restlet routera v Komponent z wieloma drogami

Component component = new Component(); 
component.getServers().add(Protocol.HTTP, port); 
component.getDefaultHost().attach(pair.uriPattern, pair.restlet); 
component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet()); 

Mój kod tętno działa.

Ale kiedy używać routera jako pair.restlet nad nim nie działa:

Router router = new Router(); 
Restlet fooHandler = new FooRouter(); 
Restlet barHandler = new BarRouter(); 

router.attach("/foo/{fooId}", fooHandler); 
router.attach("/bar/{barId1}/{barId2}", barHandler); 

Restlet doc daje tylko przykład za pomocą routera z klasą Application:

public class FirstStepsApplication extends Application { 

    @Override 
    public synchronized Restlet createInboundRoot() { 
     Router router = new Router(getContext()); 
     router.attach("/hello", HelloWorldResource.class); 
     return router; 
    } 
} 

Faktycznie użycie mojego kodu opartego na routerze daje taki sam efekt, jak trafienie w nieistniejący adres URL.

Więc pytam:

  1. Czy jest jakaś różnica między tym, co podejście oparte Router ma osiągnięcia i podejście komponentowe?
  2. Czy mogę uruchomić ten kod przy użyciu podejścia opartego na routerze? Obecnie jedynym moim rozwiązaniem jest zrzucenie wielu routerów i dołączenie do nich wielu komponentów, co wymaga obsługi większej ilości starszego kodu.

Odpowiedz

1

Nie widzę problemu z używaniem routerów na przystawce wirtualnego hosta, ponieważ Restlet pozwala na łączenie elementów w celu zbudowania łańcucha przetwarzania żądań.

Problem polega na tym, że routery mogą obsługiwać kilka tras i używasz dokładnego trybu dopasowywania (domyślnie takiego samego).

Weźmy próbkę. Jeśli pair.uriPattern zawiera /test, a na tej trasie jest podłączony router. Tylko ścieżka /test będzie obsługiwana bez względu na to, co podałeś na routerze (z wyjątkiem pustej trasy ;-)

Domyślam się, że chcesz zaimplementować dopasowanie tras podrzędnych, więc powinieneś rozważyć użycie startów z dopasowaniem podczas dołączania router do wirtualnego hosta:

Router router = (...) 

Component component = new Component(); 
component.getServers().add(Protocol.HTTP, port); 
component.getDefaultHost() 
      .attach(pair.uriPattern, router) 
      .setMatchingMode(Template.MODE_STARTS_WITH); 
component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet()); 

W tym przypadku, wszystkie wnioski, które zaczyna się od wartości pair.uriPattern będą obsługiwane przez router. Więc router powinien być zdefiniowany tak:

Router router = new Router(); 
router.attach("/something", yourRestlet1); 
router.attach("/somethingelse", yourRestlet2); 

W tym przypadku będziemy mieli następujące zachowanie:

  • Route pair.uriPattern + "/something" będą obsługiwane z yourRestlet1
  • Szlaku pair.uriPattern + "/somethingelse" będą traktowane z yourRestlet2

W rzeczywistości takie podejście jest dobrym sposobem na uporządkowanie kodu aplikacji.

Mam nadzieję, że to pomoże, Thierry