Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WEB-INF not included in WebApp using SpringBoot, Spring-MVC and Maven

I have a webapp using Spring-MVC built with Maven. When I generate the JAR file the app start just fine. The controller is execute but when I reach this part:

@RequestMapping(value = "/test-block", method = RequestMethod.GET)
public ModelAndView block(Model model) {
    return new ModelAndView("templates/test-block");
}

I get this error:

There was an unexpected error (type=Not Found, status=404).
/WEB-INF/templates/test-block.jsp

Note that debugging or running in the IDE works fine.

My folder:

src
|--main
   |--java
      |--com.xxx // sources
      webapp
      |--WEB-INF
         |--templates
            |--*.jsp // jsp files
      resources
      |--application.properties

My application properties:

spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

I checked the generated JAR file and I can't see WEB-INF anywhere.

edit:

pom file:

    <packaging>war</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
like image 358
Mariano L Avatar asked Oct 05 '18 17:10

Mariano L


People also ask

Where is web-INF folder?

WEB-INF. This directory, which is contained within the Document Root, is invisible from the web container. It contains all resources needed to run the application, from Java classes, to JAR files and libraries, to other supporting files that the developer does not want a web user to access.

Does spring boot include MVC?

Yes, you can use Spring MVC with Spring Boot. To create and run a Spring MVC web application in spring boot, you need to add the spring-boot-starter dependency in your pom. xml file.


2 Answers

You should create a .war rather than a .jar for a web application and you will see the WEB-INF folder.

Also change

spring.mvc.view.prefix=/WEB-INF/ to spring.mvc.view.prefix=/WEB-INF/templates and

ModelAndView("templates/test-block") to ModelAndView("test-block") to address the 404 error.

like image 106
Nicholas Kurian Avatar answered Oct 20 '22 13:10

Nicholas Kurian


Reference the Spring Boot documentation on serving static content.

Of note:

By default, Spring Boot serves static content from a directory called /static (or /public or /resources or /META-INF/resources) in the classpath or from the root of the ServletContext. It uses the ResourceHttpRequestHandler from Spring MVC so that you can modify that behavior by adding your own WebMvcConfigurer and overriding the addResourceHandlers method.

...

You can also customize the static resource locations by using the spring.resources.static-locations property (replacing the default values with a list of directory locations).

...

Do not use the src/main/webapp directory if your application is packaged as a jar. Although this directory is a common standard, it works only with war packaging, and it is silently ignored by most build tools if you generate a jar.

So, what you're seeing is the expected behavior. You can either move your templates to one of the expected locations, customize the default locations, or use war packaging.

like image 3
The Gilbert Arenas Dagger Avatar answered Oct 20 '22 14:10

The Gilbert Arenas Dagger