首页 文章

Spring Boot和Vaadin UI无法访问?

提问于
浏览
2

我设置了一个spring boot vaadin项目并根据springs tutorial实现了这个类,但无法使用localhost:8080 / ui访问ui . 我究竟做错了什么?

我的UI类:

package net.lawyd.server.ui;

import com.vaadin.annotations.Theme;
import com.vaadin.server.VaadinRequest;
import com.vaadin.spring.annotation.SpringUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.Notification;
import com.vaadin.ui.UI;

@SpringUI(path = "/ui")
@Theme("valo")
public class VaadinUI extends UI {

    @Override
    protected void init(VaadinRequest request) {
        setContent(new Button("Click me", e -> Notification.show("Hello Spring+Vaadin user!")));
    }
}

这是我的Spring配置类:

package net.lawyd.server.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@ComponentScan("net.lawyd.server")
@EnableJpaRepositories("net.lawyd.server")
@EnableTransactionManagement
public class SpringConfig {

    // Nothing to do here

}

这是我的pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.lawyd</groupId>
    <artifactId>lawyd-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>3.0.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

[更新1]我注意到这条日志消息:

无法增强@Configuration bean定义'com.vaadin.spring.VaadinConfiguration',因为它的单例实例创建得太早 . 典型的原因是具有BeanDefinitionRegistryPostProcessor返回类型的非静态@Bean方法:请考虑将此类方法声明为“static” .

[更新2]我使用start.spring.io创建了一个空的spring启动应用程序,并从教程中插入了demo . 它在那里工作,所以它必须与我的设置 .

[更新3]我发现它与JerseyConfig有关,当我把它拿出来时,Vaadin的作品,但是球衣不再了:

@SpringBootConfiguration
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        register(TodoResource.class);
        register(HealthResource.class);
    }
}

这里也是code on github .

1 回答

  • 1

    我找到了根问题:Jersey被映射到root,所以root上的所有调用都被截获了 . 将 @ApplicationPath("/api") 更改为root以外的其他内容可以解决问题:

    @SpringBootConfiguration
    @ApplicationPath("/api")
    public class JerseyConfig extends ResourceConfig {
    

相关问题