簡體   English   中英

RedirectAttributes不適用於Spring 5

[英]RedirectAttributes not working with Spring 5

我在Spring Webflux應用程序上,並且想在我的一個控制器上執行重定向:

@Controller
@RequestMapping(value = "/login")
public class AuthenticationController {

    @Autowired
    private AuthenticationFacade authenticationFacade;

    @GetMapping
    public String loginView(final Model model) {

        model.addAttribute("authenticationForm", new AuthenticationForm());

        return "login";
    }

    @PostMapping
    public Rendering authenticate(@Valid final AuthenticationForm authenticationForm,
                                  final BindingResult bindingResult, final RedirectAttributes redirectAttributes) {

        if (!bindingResult.hasErrors()) {
            final AccountDto authenticatedAccount =
                    this.authenticationFacade.authenticate(authenticationForm).block();

            if (authenticatedAccount != null) {
                return Rendering.redirectTo("/home").build();
            }
        }

        return Rendering.view("login").build();
    }
}

我知道Rendering.redirectTo()作為RedirectView執行重定向。 但是,當我在控制器方法參數中添加RedirectAttributes以提供重定向屬性時,出現以下異常:

2017-09-28 18:35:08.084 ERROR 3702 --- [nio-9000-exec-3] o.s.w.s.adapter.HttpWebHandlerAdapter    : Failed to handle request

java.lang.IllegalStateException: Failed to invoke handler method with resolved arguments: [0][type=org.springframework.validation.support.BindingAwareConcurrentModel][value={}],[1][type=org.springframework.validation.support.BindingAwareConcurrentModel][value={}] on public java.lang.String fr.auchan.wheatley.front.controller.AuthenticationController.loginView(org.springframework.ui.Model,org.springframework.web.servlet.mvc.support.RedirectAttributes)
    at org.springframework.web.reactive.result.method.InvocableHandlerMethod.lambda$invoke$0(InvocableHandlerMethod.java:131)
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:118)
    at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1010)
    at reactor.core.publisher.MonoWhen$WhenCoordinator.signal(MonoWhen.java:246)
    at reactor.core.publisher.MonoWhen$WhenInner.onNext(MonoWhen.java:306)
    at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:198)
    at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:1567)
    at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:139)
    at reactor.core.publisher.MonoWhen$WhenInner.onSubscribe(MonoWhen.java:296)
    at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onSubscribe(FluxPeekFuseable.java:173)
    at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54)
    at reactor.core.publisher.MonoPeekFuseable.subscribe(MonoPeekFuseable.java:74)
    at reactor.core.publisher.Mono.subscribe(Mono.java:2769)
    at reactor.core.publisher.MonoWhen$WhenCoordinator.subscribe(MonoWhen.java:177)
    at reactor.core.publisher.MonoWhen.subscribe(MonoWhen.java:127)
    at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
    at reactor.core.publisher.MonoPeekFuseable.subscribe(MonoPeekFuseable.java:74)
    at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)
    at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:147)
    at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56)
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:148)
    at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67)
    at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:76)
    at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:270)
    at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:790)
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:115)
    at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:1567)
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:156)
    at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1381)
    at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:1255)
    at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90)
    at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54)
    at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
    at reactor.core.publisher.Mono.subscribe(Mono.java:2769)
    at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:414)
    at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:210)
    at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:91)
    at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:55)
    at reactor.core.publisher.FluxConcatMap.subscribe(FluxConcatMap.java:121)
    at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40)
    at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44)
    at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
    at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
    at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)
    at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)
    at reactor.core.publisher.Mono.subscribe(Mono.java:2769)
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:165)
    at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56)
    at reactor.core.publisher.Mono.subscribe(Mono.java:2769)
    at org.springframework.http.server.reactive.ServletHttpHandlerAdapter.service(ServletHttpHandlerAdapter.java:116)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

這是我的配置:-Spring Boot 2.0.0.M3(Spring 5.0.0.RC3)。 -Spring Webflux

在Spring 5中是否不可能以這種方式提供重定向屬性? 還有另一種方法可以做到嗎,或者它是一個錯誤?

您嘗試在Spring WebFlux中使用org.springframework.web.servlet.mvc.support.RedirectAttributes (Spring MVC類)。 這行不通。

我不了解WebFlux中的任何等效功能,這可能是一項增強請求。

我不確定在Spring 5中如何工作。但是,從根本上講,當您重定向到另一個URL時,它將成為對HTTP服務器的新請求。 這意味着,服務器需要新重定向請求中的所有必需屬性和參數才能進行訪問。

我認為,這就是您所遇到的問題,您的控制器期望參數由於使用重定向生成的新請求而丟失。 嘗試找到一種方法來轉發此請求,而不是重定向。 這將在您的最終控制器的請求中包含所有原始屬性。

我不確定,如果我能正確理解該問題,並且可以就此問題解決方案提出任何建議。

如答案中所述,Spring Webflux目前似乎不存在RedirectAttributes等效項。

我在Spring上打開了JIRA來尋求改進,如果有人也有興趣對此進行更新,請訪問以下鏈接: https : //jira.spring.io/browse/SPR-16026

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM