2017-01-05 6 views
4

Spring과 함께 반응 형 프로그래밍 세계에 참여하고 싶습니다. 내가 알기로, it gives me a choice between two different paradigms : 주석 기반 (우리에게 잘 알려진 @Controller, @RequestMapping) 및 반응식 (which is intended to resolve an "Annotation Hell")입니다.Spring 5를 사용한 실제 컨트롤러 예제 : Web Reactive

내 문제는 일반적인 반응 형 컨트롤러가 어떻게 보일지 이해가 부족하다는 것입니다. 내 컨트롤러 클래스에서 사용할 수있는 세 가지 개념 인터페이스가있다 :

HandlerFunction<T> (1) - 그때 라우터에이 방법을 등록, 구체적인 HandlerFunction<T> 인스턴스를 반환 각각의 특정 ServerRequest 하는 방법을 정의합니다. 권리?

RouterFunction (2) FilterFunction (3) - HandlerFunction의 상응하는 모든 RequestPredicate의 배치해야 특정 장소가 있습니까? 또는 주석 방법과 관련하여 각 컨트롤러에서 개별적으로 수행 할 수 있습니까? 그렇다면 글로벌 컨트롤러 (라우터가있는 경우)에이 컨트롤러에서이 라우터 부분을 적용하는 방법은 무엇입니까?

지금에 의해 반응성 컨트롤러 "템플릿"을 참조하는 방법 그건 :

public class Controller { 
    // handlers 
    private HandlerFunction<ServerResponse> handleA() { 
     return request -> ok().body(fromObject("a")); 
    } 

    // router 
    public RouterFunction<?> getRouter() { 
     return route(GET("/a"), handleA()).and(
       route(GET("/b"), handleB())); 
    } 

    // filter 
    public RouterFunction<?> getFilter() { 
     return route(GET("/c"), handleC()).filter((request, next) -> next.handle(request)); 
    } 
} 

그리고를, 마지막으로, 어떻게 주석으로 표시하지 않고는, 컨트롤러라고 말을?

저는 스프링 관련 참고 자료 및이 블로그와 관련된 모든 게시물을 공식 블로그에서 읽었습니다. 많은 샘플이 있지만, 모두 컨텍스트 (IMHO)에서 빠져 나와 전체 그림으로 어셈블 할 수는 없습니다.

실제 사례를 제공하고 이러한 기능 간의 상호 작용을 체계화하는 방법에 대해 잘 알고 있다면 감사하게 생각합니다.

+1

이 특히 동안 때문에, 아마 제기로 너무 광범위 API는 아마도 대부분 안정적 일 것입니다. 스프링 5는 아직 기술적으로 RC가 아닙니다 (그리고 Spring Security Reactive는 여전히 주요 개발 단계에 있습니다). – chrylis

+3

_ "스프링을 사용한 반응 형 프로그래밍 세계 ... 두 가지 패러다임 중에서 하나를 선택할 수 있습니다. 주석 기반과 반응 형 중 하나"_ 주석 기반 및 기능적 "과 같은 것이어야합니다. 둘 다 반응 적이며 주석 기반 스타일에만 고전적인 컨트롤러가 있습니다. – zeroflagL

+1

여기에 묻는 것은 기능 모델의 경우 특히 "코드 구성 방법"입니다. 나는 이것으로 또한 고투했다. 샘플 코드는 하나의 긴 NLP 스타일 체인에서 모든 요청 매핑 (경로)을 선언해야합니다. 이것은 동일한 클래스 파일에 언급 될 필요가없는 라우트 사이의 결합을 도입하고, 핸들러 특정 클래스를 작성하려고하면 해당 라우트가 별도로 저장됩니다. 주석 기반 접근 방식은 이러한 문제를 해결할 수있는 것처럼 보입니다. 그러나 아직 그 방법을 작동시키지 못했습니다. 그것이 효과가 있었다고하더라도, 왜 기능적 접근 방식을 가지고 있습니까? – allenru

답변

2

내가 걱정 지금까지 같이

RouterFunction 새로운 Spring approach의 측면에서 @Controller에 가장 가까운 아날로그 (정확하게 @RequestMapping)입니다 :

들어오는 요청이 RouterFunction와 핸들러 함수에 전달됩니다 (예 : 기능>). 라우터 함수는 일치하는 경우 처리기 함수로 평가됩니다. 그렇지 않으면 빈 결과를 리턴합니다. RouterFunction은 @RequestMapping 주석과 비슷한 목적을 가지고 있습니다. 그러나 중요한 차이가 있습니다. 주석을 사용하는 경우 경로는 주석 값을 통해 표현할 수있는 것으로 제한되며, 그 처리는 무시에 대해 간단하지 않습니다. 라우터 기능을 사용하면 처리 코드가 바로 앞에 있습니다 : 매우 쉽게 무시하거나 바꿀 수 있습니다.

// route is your route function 
HttpHandler httpHandler = RouterFunctions.toHttpHandler(route); 
HttpServlet servlet = new ServletHttpHandlerAdapter(httpHandler); 
Tomcat server = new Tomcat(); 
Context rootContext = server.addContext("", 
System.getProperty("java.io.tmpdir")); 
Tomcat.addServlet(rootContext, "servlet", servlet); 
rootContext.addServletMapping("/", "servlet"); 
tomcatServer.start(); 

모두 무효 및 비 반응성 방법이 있습니다 주요 방법으로 수동으로 실행 서버에서

그리고 대신의 봄 부팅 SpringApplication.run.그것은 봄에 묘사 된 것 github

+0

응답 해 주셔서 감사합니다.하지만 저는 컨트롤러가 어떻게 보이는지, 컨트롤러 간의 상호 작용을 어떻게 구성하는지에 주로 관심이있었습니다. 스 니펫은 글로벌/공유 된 것을 수집 할 때 (라우터 기능은 모든 것을 한 번에 한 곳으로 모으기 때문에) 엉망이 될 것입니다. – Andrew

+0

github 링크를 이용해 주셔서 감사합니다.하지만'main' 메소드 나'configureGlobalRouting'과 같은 메소드에 라우팅 로직을 쓰고 싶지는 않습니다. – Andrew

+0

@AndrewTobilko 나는 새 스프링과 비슷한 ratpack 프레임 워크와 매우 비슷하게 제안 할 수있다 : https://ratpack.io/manual/current/spring.html#the_spring_convenience_class –