vaadin / spring

Spring integration for Vaadin
https://vaadin.com/start
176 stars 101 forks source link

Servlet url mapping issue for /VAADIN/* #227

Open endertunc opened 7 years ago

endertunc commented 7 years ago

Hi all, Related: https://vaadin.com/forum#!/thread/13846398

I want to map Vaadin7 + Spring Boot application to /app as discussed in the Vaadin from.

I read the following comment (https://github.com/vaadin/spring/blob/master/vaadin-spring-boot/src/main/java/com/vaadin/spring/boot/internal/VaadinServletConfigurationProperties.java#L69) and I thought that it should do the trick. So, I added vaadin.servlet.urlMapping = /app/*to application.properties and It did map the application to /app but did not map /VAADIN/* to app/VAADIN/*. Does it mean it does not work cause it says it should also map /VAADIN/* to the same servlet?

2017-07-21 00:49:14.091  INFO 91163 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Registering Vaadin servlet
2017-07-21 00:49:14.091  INFO 91163 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Servlet will be mapped to URLs [/app, /app/*, /VAADIN/*]
2017-07-21 00:49:14.102  INFO 91163 --- [ost-startStop-1] o.v.spring.servlet.Vaadin4SpringServlet  : Using custom Vaadin4Spring servlet
2017-07-21 00:49:14.110  INFO 91163 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Setting servlet init parameters
2017-07-21 00:49:14.111  INFO 91163 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Set servlet init parameter [productionMode] = [false]
2017-07-21 00:49:14.111  INFO 91163 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Set servlet init parameter [resourceCacheTime] = [3600]
2017-07-21 00:49:14.111  INFO 91163 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Set servlet init parameter [heartbeatInterval] = [300]
2017-07-21 00:49:14.111  INFO 91163 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Set servlet init parameter [closeIdleSessions] = [false]
2017-07-21 00:49:14.111  INFO 91163 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Set servlet init parameter [Resources] = [/app]
2017-07-21 00:49:14.248  INFO 91163 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2017-07-21 00:49:14.250  INFO 91163 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'vaadin4SpringServlet' to [/app, /app/*, /VAADIN/*]
2017-07-21 00:49:14.252  INFO 91163 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'metricsFilter' to: [/*]
2017-07-21 00:49:14.253  INFO 91163 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-07-21 00:49:14.253  INFO 91163 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-07-21 00:49:14.253  INFO 91163 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-07-21 00:49:14.253  INFO 91163 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-07-21 00:49:14.253  INFO 91163 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'webRequestLoggingFilter' to: [/*]
2017-07-21 00:49:14.253  INFO 91163 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpResponseFilter' to: [/*]
2017-07-21 00:49:14.253  INFO 91163 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'applicationContextIdFilter' to: [/*]

Then, I added vaadin.servlet.resources = /app to application.properties and it start to get 404 not found for path /app/VAADIN/..... Only one thing added to the console output:

2017-07-21 00:49:14.111  INFO 91163 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Set servlet init parameter [Resources] = [/app]

After that, I tried to put /VAADIN/* folder manually to app/VAADIN/* in the jar but it did not work as well.

I use vaadin-spring version 1.2.0. Tried to update 2.0.0. but gives me strange exception so I gave up. [Edit: Please refer to the error in the second comment for the error.]

This is the build.gradle that I have:

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "com.devsoap.plugin:gradle-vaadin-plugin:1.2.0"
    }
}

plugins {
    id "com.devsoap.plugin.vaadin" version "1.2.0"
    id 'org.springframework.boot' version '1.5.4.RELEASE'
    id 'idea'
}

ext {
    vaadinVersion = '7.7.4'
}

group = 'org.vaadin'
sourceCompatibility = 1.8
targetCompatibility = 1.8
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

jar {
    baseName = 'name'
    // Include app theme + compiled widget as well as classes into our jar
    from ("src/main/webapp") {
        into ("BOOT-INF/classes/app") // It is actually located under the "BOOT-INF/classes"
    }
    from 'src/main/webapp', sourceSets.main.output
    // Compile theme and widgetset before creating jar
    dependsOn 'vaadinCompile', 'vaadinThemeCompile'
    // Sprinkle some spring boot sugar on the jar to make it runnable
    finalizedBy bootRepackage
}

vaadin {
    version "${vaadinVersion}"
    manageDependencies true
}

vaadinCompile.widgetsetCDN = true
vaadinCompile.manageWidgetset = true

repositories {
    maven { url "http://virit.in/maven2" }
    maven { url "http://maven.vaadin.com/vaadin-addons" }
    maven { url "http://repo.maven.apache.org/maven2" }
}

dependencies {
    compile group: 'org.vaadin.addons', name: 'formcheckbox', version:'1.0.2'
    compile group: 'com.vaadin', name: 'vaadin-spring-boot-starter', version:'2.0.0'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version:'1.5.4.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version:'1.5.4.RELEASE'
    compile group: 'org.flywaydb', name: 'flyway-core', version:'3.2.1'
    compile group: 'com.vaadin', name: 'vaadin-spring', version:'1.2.0'
    compile group: 'org.vaadin.spring.extensions', name: 'vaadin-spring-ext-boot', version:'2.0.0.RELEASE' 
    compile group: 'org.vaadin.spring.addons', name: 'vaadin-spring-addon-eventbus', version:'2.0.0.RELEASE' 
    compile group: 'org.vaadin.teemu', name: 'switch', version:'2.0.3'
    compile(group: 'org.vaadin', name: 'vaadin-java-ee-essentials', version:'1.16') {
        exclude(module: 'vaadin-client-compiled')
    }
    compile group: 'org.scribe', name: 'scribe', version:'1.3.5'
    compile group: 'org.vaadin.addon', name: 'easyuploads', version:'7.4.10'
    compile group: 'com.google.code.gson', name: 'gson', version:'2.3'
    compile group: 'org.apache.commons', name: 'commons-email', version:'1.4'
    compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version:'1.5.4.RELEASE'
    compile group: 'org.vaadin', name: 'viritin', version:'1.58'
    compile group: 'org.vaadin.teemusa', name: 'sidemenu', version:'1.0'
    compile group: 'com.vaadin', name: 'vaadin-icons', version:'2.0.0'
    runtime group: 'mysql', name: 'mysql-connector-java', version:'5.1.40'
    testCompile(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version:'1.5.4.RELEASE') {
        exclude(module: 'commons-logging')
    }
}

dependencyManagement {
    imports {
        mavenBom "com.vaadin:vaadin-bom:${vaadinVersion}"
    }
}

Best regards. Ender

ghost commented 7 years ago

Hi! /app/VAADIN will never work the way you want it to. Your Vaadin servlet needs to be mapped to /app and /VAADIN. That's because the client side will always make requests to <servlet-context-root>/VAADIN, not to<servlet-context-root>/app/VAADIN

endertunc commented 7 years ago

Hi @mac-at-vaadin, thank you for your time and response. Could you please check the following repository: https://github.com/christoph-frick/springboot-groovy-vaadin-starter

If you enable urlMapping and resourceMapping in the configuration you can see that both will work. https://github.com/christoph-frick/springboot-groovy-vaadin-starter/blob/master/src/main/resources/application.yaml#L13

http://imgur.com/Lj3u3OK

Note that example uses Vaadin 8 and when you switch to Vaadin 7 application compiles but fails on runtime.

java.lang.NoSuchMethodError: com.vaadin.server.VaadinServletService.addSessionInitListener(Lcom/vaadin/server/SessionInitListener;)Lcom/vaadin/shared/Registration;
        at com.vaadin.spring.server.SpringVaadinServlet.servletInitialized(SpringVaadinServlet.java:75)
        at com.vaadin.server.VaadinServlet.init(VaadinServlet.java:234)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1183)
        at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:795)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:133)
        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:861)
        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)

2017-07-21 11:24:06.236 ERROR 96693 --- [0.1-8080-exec-1] o.a.c.c.C.[.[.[/].[springVaadinServlet]  : Allocate exception for servlet springVaadinServlet

java.lang.NoSuchMethodError: com.vaadin.server.VaadinServletService.addSessionInitListener(Lcom/vaadin/server/SessionInitListener;)Lcom/vaadin/shared/Registration;
        at com.vaadin.spring.server.SpringVaadinServlet.servletInitialized(SpringVaadinServlet.java:75)
        at com.vaadin.server.VaadinServlet.init(VaadinServlet.java:234)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1183)
        at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:795)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:133)
        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:861)
        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)
christoph-frick commented 6 years ago

@endertunc The error you get there is realted to the wrong version of vaadin-spring. The repo also has a (now deprecated) vaadin-7 branch, which you should have more luck with.

sspaenig commented 6 years ago

Hi @endertunc,

have you been able to solve the servlet url mapping issue? Could you please specify what you have exactly added in application.yaml to solve the problem?

Kind regards

Sebastian

endertunc commented 6 years ago

Hi @sspaenig, sorry, I could not find a solution. It was not a hard requirement so we decided to not do that.

netmikey commented 6 years ago

For anyone stumbling upon this via google, here's an update:

With Spring Boot 2.0.1.RELEASE, Vaadin 8.3.3 and Vaadin Spring extensions 2.0.0.RELEASE, the context path mapping seems to work with the following configuration:

vaadin.servlet.urlMapping = /app
vaadin.servlet.resources = /app

When watching the browser's requests, everything seems to go to /app/* resources as expected.