如何在 Vaadin 页面中使用路由参数

问题描述 投票:0回答:1

我正在 Spotify API 和 API 的 Java 包装器的帮助下使用 Vaadin 创建一个 Spring 应用程序。我试图从导航到当前页面的 RouteLink 中获取一个路由参数,并使用该字符串参数来帮助我显示我需要的信息。

带有 RouterLink 的页面有一个 for 循环,循环遍历各种歌曲的搜索结果,然后为每首歌曲提供一个链接,其中包含 Spotify Track ID 的不同路由参数。

RouterLink songPageLink = new RouterLink("Song Details", songDescription.class, new RouteParameters("trackID", track.getId()));

这是我正在处理的页面的代码:

package trackour.trackour.views.songDescription;

import org.springframework.stereotype.Component;

import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.html.Image;
import com.vaadin.flow.component.html.Paragraph;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.BeforeEnterEvent;
import com.vaadin.flow.router.BeforeEnterObserver;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.server.auth.AnonymousAllowed;

import trackour.trackour.views.api.APIController;

@Route("songDescription/:trackID?")
@PageTitle("Description")
@AnonymousAllowed
@Component
public class songDescription extends VerticalLayout implements BeforeEnterObserver {

    private String trackID;

    public songDescription() {

        H1 songTitle = new H1("SONG NAME");
        H2 songArtist = new H2("SONG ARTIST");
        Image albumCover = new Image();

        Paragraph acousticnessDetail = new Paragraph("VALUE");
        Paragraph danceabilityDetail = new Paragraph("VALUE");
        Paragraph energyDetail = new Paragraph("VALUE");
        Paragraph instrumentalnessDetail = new Paragraph("VALUE");
        Paragraph keyDetail = new Paragraph("VALUE");
        Paragraph livenessDetail = new Paragraph("VALUE");
        Paragraph loudnessDetail = new Paragraph("VALUE");
        Paragraph modeDetail = new Paragraph("VALUE");
        Paragraph tempoDetail = new Paragraph("VALUE");
        Paragraph timeSignatureDetail = new Paragraph("VALUE");
        Paragraph valenceDetail = new Paragraph("VALUE");
        
        add(albumCover, songTitle, songArtist, acousticnessDetail, danceabilityDetail, 
            energyDetail, instrumentalnessDetail, keyDetail, livenessDetail, loudnessDetail, 
            modeDetail, tempoDetail, timeSignatureDetail, valenceDetail);
    }

    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        trackID = event.getRouteParameters().get("trackID").orElseThrow();
    }
}

代码按照我提供的方式运行良好,但是一旦我尝试使用

trackID
变量,我就会得到不同的 Spring Bean 异常。

这是我想如何使用路由参数的示例:

H1 songTitle = new H1(APIController.getTrackName(trackID));

一旦我这样做,我就会收到此错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'songDescription' defined in file [C:\Users\gohar\OneDrive\SFU\CMPT276\trackour\target\classes\trackour\trackour\views\songDescription\songDescription.class]: Failed to instantiate [trackour.trackour.views.songDescription.songDescription]: Constructor threw exception
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1314) ~[spring-beans-6.0.10.jar:6.0.10]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1199) ~[spring-beans-6.0.10.jar:6.0.10]        
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560) ~[spring-beans-6.0.10.jar:6.0.10]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.10.jar:6.0.10]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.10.jar:6.0.10]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.10.jar:6.0.10]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.10.jar:6.0.10]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.10.jar:6.0.10]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[spring-beans-6.0.10.jar:6.0.10]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:941) ~[spring-context-6.0.10.jar:6.0.10]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608) ~[spring-context-6.0.10.jar:6.0.10]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.1.1.jar:3.1.1]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-3.1.1.jar:3.1.1]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436) ~[spring-boot-3.1.1.jar:3.1.1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-3.1.1.jar:3.1.1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.1.1.jar:3.1.1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.1.1.jar:3.1.1]
        at trackour.trackour.Application.main(Application.java:26) ~[classes/:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) ~[spring-boot-devtools-3.1.1.jar:3.1.1]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [trackour.trackour.views.songDescription.songDescription]: Constructor threw exception
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:224) ~[spring-beans-6.0.10.jar:6.0.10]
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87) ~[spring-beans-6.0.10.jar:6.0.10]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1308) ~[spring-beans-6.0.10.jar:6.0.10]
        ... 22 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke "String.length()" because "replacement" is null
        at java.base/java.util.regex.Matcher.appendExpandedReplacement(Matcher.java:1014) ~[na:na]
        at java.base/java.util.regex.Matcher.appendReplacement(Matcher.java:997) ~[na:na]        
        at java.base/java.util.regex.Matcher.replaceAll(Matcher.java:1181) ~[na:na]
        at java.base/java.lang.String.replaceAll(String.java:2940) ~[na:na]
        at se.michaelthelin.spotify.requests.AbstractRequest$Builder.setPath(AbstractRequest.java:244) ~[spotify-web-api-java-8.0.0.jar:na]
        at se.michaelthelin.spotify.requests.data.tracks.GetTrackRequest$Builder.build(GetTrackRequest.java:89) ~[spotify-web-api-java-8.0.0.jar:na]
        at trackour.trackour.views.api.APIController.getTrackName(APIController.java:300) ~[classes/:na]
        at trackour.trackour.views.songDescription.songDescription.<init>(songDescription.java:28) ~[classes/:na]
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na]
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na]    
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:198) ~[spring-beans-6.0.10.jar:6.0.10]
        ... 24 common frames omitted
java spring vaadin spotify
1个回答
0
投票

看起来您正在尝试在构造函数中使用 trackID,但这里它尚未初始化。 您必须使用 trackID 将代码移动/调用到 beforeEnter 方法或 beforeEnter 之后发生的另一个路由生命周期事件

© www.soinside.com 2019 - 2024. All rights reserved.