Roberto
Roberto

Reputation: 1395

Why rest end-points are not found?

I have spring-boot application with spring-boot-starter-web and jpa. Localy it works ok.

Then, I build war file and try to deploy it on websphere.

My project has next structure:

enter image description here

And when, after deploy on websphere my application, I load root like ip:port/test - start page from index.html is shown.

But, when try to open some rest of my application - there is 404 error shows. For send request from client, I try to use postman.

SpringBoot class is:

@ComponentScan({"data"})
@EntityScan(basePackages = {"data.model"})
@EnableJpaRepositories(basePackages = {"data.persistence"})
@EnableAutoConfiguration
@SpringBootApplication
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {

    }
}

Without onstartup method, war failes on server when try to launch.

Upvotes: 0

Views: 362

Answers (1)

Gas
Gas

Reputation: 18030

This simple example works ok on Liberty, if you want to package your app as an war file, so verify if you have correct setup by trying to run this, then extend with functions that you need.

@SpringBootApplication
@RestController
public class SpringBootLibertyApplication extends SpringBootServletInitializer {

    //@Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringBootLibertyApplication.class);
    }

    @RequestMapping("/hello")
    public String hello() {
        return "Hello from Spring Boot running on Liberty!";
    }

}

UPDATE

Below is pom.xml that I used. It is not the most simple one, as in addition, you have Liberty plugin configured, which creates a server based on your server.xml file and also packages final server as jar file. I did that for my own testing so you may comment it out in the pom. I dont have any web.xml.

As others already commented, the primary issue in your setup is that your Application class is not at the root of the package, and thats confuses all the spring auto configuration features. So move your springboot.config.Application to data.Application.

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>gas.tests</groupId>
<artifactId>liberty.springboot</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<!-- contains default pluginManagement configuration for liberty-maven-plugin -->
<parent>
    <groupId>net.wasdev.wlp.maven.parent</groupId>
    <artifactId>liberty-maven-app-parent</artifactId>
    <version>2.1.2</version>
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

    <app.name>LibertySpringBoot</app.name>
    <testServerHttpPort>9080</testServerHttpPort>
    <testServerHttpsPort>9443</testServerHttpsPort>
    <warContext>${app.name}</warContext>
    <package.file>${project.build.directory}/${project.artifactId}-${project.version}.zip</package.file>
    <packaging.type>usr</packaging.type>
</properties>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-client</artifactId>
        <version>3.1.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.0.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>net.wasdev.maven.tools.targets</groupId>
        <artifactId>liberty-target</artifactId>
        <version>18.0.0.2</version>
        <scope>provided</scope>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.3.0.RELEASE</version>
        <exclusions>
          <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
          </exclusion>
        </exclusions>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
                <packagingExcludes>pom.xml</packagingExcludes>
            </configuration>
        </plugin>
        <!-- Plugin to run unit tests -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <executions>
                <execution>
                    <phase>test</phase>
                    <id>default-test</id>
                    <configuration>
                        <excludes>
                            <exclude>**/it/**</exclude>
                        </excludes>
                        <reportsDirectory>${project.build.directory}/test-reports/unit</reportsDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Enable liberty-maven plugin -->
        <plugin>
            <groupId>net.wasdev.wlp.maven.plugins</groupId>
            <artifactId>liberty-maven-plugin</artifactId>
            <configuration>
                <assemblyArtifact>
                    <groupId>com.ibm.websphere.appserver.runtime</groupId>
                    <artifactId>wlp-webProfile7</artifactId>
                    <version>18.0.0.2</version>
                    <type>zip</type>
                </assemblyArtifact>
                <configFile>${basedir}/src/main/liberty/config/server.xml</configFile>
                <serverEnv>${basedir}/src/main/liberty/config/server.env</serverEnv>
                <jvmOptionsFile>${basedir}/src/main/liberty/config/jvm.options</jvmOptionsFile>
                <packageFile>${package.file}</packageFile>
                <include>${packaging.type}</include>
                <bootstrapProperties>
                    <app.location>${project.artifactId}-${project.version}.war</app.location>
                    <default.http.port>${testServerHttpPort}</default.http.port>
                    <default.https.port>${testServerHttpsPort}</default.https.port>
                </bootstrapProperties>
                <features>
                    <acceptLicense>true</acceptLicense>
                </features>
                <looseApplication>false</looseApplication>
                <serverName>${app.name}Server</serverName>
            </configuration>
            <!-- gas -->
            <executions>
             <execution>
                <id>package-server</id>
                <phase>package</phase>
                <goals>
                    <goal>package-server</goal>
                </goals>
                <configuration>
                    <packageFile>${project.build.directory}/${app.name}-wlp.jar</packageFile>
                    <include>runnable</include>
                </configuration>
             </execution>
            </executions>

        </plugin>
        <!-- Plugin to run functional tests -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.18.1</version>
            <executions>
                <execution>
                    <phase>integration-test</phase>
                    <id>integration-test</id>
                    <goals>
                        <goal>integration-test</goal>
                    </goals>
                    <configuration>
                        <includes>
                            <include>**/it/**</include>
                        </includes>
                        <systemPropertyVariables>
                            <liberty.test.port>${testServerHttpPort}</liberty.test.port>
                            <war.context>${warContext}</war.context>
                        </systemPropertyVariables>
                    </configuration>
                </execution>
                <execution>
                    <id>verify-results</id>
                    <goals>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <summaryFile>${project.build.directory}/test-reports/it/failsafe-summary.xml</summaryFile>
                  <reportsDirectory>${project.build.directory}/test-reports/it</reportsDirectory>
            </configuration>
        </plugin>
    </plugins>
</build>

<profiles>
    <profile>
        <id>runnable</id>
        <properties>
              <package.file>${project.build.directory}/${app.name}.jar</package.file>
            <packaging.type>runnable</packaging.type>
        </properties>
    </profile>
    </profiles>
</project>

Upvotes: 1

Related Questions