Jason Sutanto
Jason Sutanto

Reputation: 1

PostMapping Spring boot annotation is not working

I am new to spring boot and do not know why my @PostMapping is not working and leading to a white label error. Everything else works fine and I can add customers to the h2 database. However, once I add customers and go to URL localhost:8084/getdetails and type 1, a white label error occurs. However, the form in the ViewCustomers.jsp file is still displayed but cannot take in any input. The form should invoke toString() of the customer object and its fields.

Controller

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class FormController {
  @Autowired
  CustomerRepo repo;

  @RequestMapping("/")
  public String details() {
    return "edureka";
  }

  @RequestMapping("/details")
  public String details(Customers customers) {
    repo.save(customers);
    return "edureka";
  }

  @RequestMapping("/getdetails")
  public String getdetails() {
    return "ViewCustomers";
  }

  @PostMapping("/getdetails")
  public ModelAndView getdetails(@RequestParam int cid) {
    System.out.println("here");
    ModelAndView mv = new ModelAndView("Retrieve");
    Customers customers = repo.findById(cid).orElse(null);
    mv.addObject(customers);
    return mv;
  }
}

edureka.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Edureka Customers</title>
</head>
<body>
    <form method="post" action="details">
        Enter Customer ID: <input type="text" name="cid"><br><br>
        Enter Customer Name: <input type="text" name="cname"><br><br>    
        Enter Customer Email Address: <input type="email" name="cemail"><br><br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

ViewCustomer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>View Customer Details</h1>
    <h2>Details as submitted as follows</h2>
    <form method="getdetails" action="post">
        <input type="number" name="cid"><br> 
        <input type="submit" value="Submit">
    </form>
</body>
</html>

Retrieve.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>Retrieve Customer Details</h1>
    <h2>Details as submitted as follows:</h2>
    <h5>${customers}</h5>
</body>
</html>

Customers.java

package com.example.demo;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Customers {
  @Id
  private int cid;
  private String cname;
  private String cemail;

  public int getCid() {
    return cid;
  }

  public void setCid(int cid) {
    this.cid = cid;
  }

  public String getCname() {
    return cname;
  }

  public void setCname(String cname) {
    this.cname = cname;
  }

  public String getCemail() {
    return cemail;
  }

  public void setCemail(String cemail) {
    this.cemail = cemail;
  }

  @Override
  public String toString() {
    return "Customers [cid=" + cid + ", cname=" + cname + ", cemail=" + cemail + "]";
  }
}

CustomerRepo interface package com.example.demo;

import org.springframework.data.repository.CrudRepository;

public interface CustomerRepo extends CrudRepository<Customers,Integer>{

}

SubmissionFormApplication.java

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import com.example.demo.SubmissionFormApplication;

@ComponentScan
@SpringBootApplication
public class SubmissionFormApplication extends SpringBootServletInitializer{
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
      return application.sources(SubmissionFormApplication.class);
    }
    public static void main(String[] args) {
        SpringApplication.run(SubmissionFormApplication.class, args);
    }

}

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.13.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>SubmissionForm</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SubmissionForm</name>
    <description>First Spring Boot Web app</description>

    <properties>
        <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper -->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jasper</artifactId>
            <version>9.0.31</version>
        </dependency>
    </dependencies>

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

</project>

Upvotes: 0

Views: 5829

Answers (3)

blurfus
blurfus

Reputation: 14031

A few things:

  1. Your Controller can be annotated like @RestController instead of just @Controller.

  2. Your mappings for POST is @PostMapping - For consistency, I would recommend your mapping for GET to be @GetMapping - So I'd replace all @RequestMapping with @GetMapping (this removes ambiguity and improves readability as well)

  3. The form in your eureka.jsp, needs to change the URL is posting to. Instead of action=details it should point to action=getdetails

  4. The form in your view viewcustomer.jsp has the action and the post switched (the method should be POST the action should be getdetails)

Upvotes: 1

David Enoma
David Enoma

Reputation: 311

The ViewCustomer.jsp form's Method should have method as post and action as get details. The problem is in html and not spring.

Upvotes: 2

zhang
zhang

Reputation: 1

The @PostMapping("/getdetails") maps to the path "/getdetails". Such a mapping already exists. Try to map to another path in order to resolve this conflict.

Upvotes: 0

Related Questions