0

I am making a web application in spring boot and I want to handle the unique key constraint exception and return the error message back to the input page. I have searched a lot for this method but didn't find it.

Controller class:-

package com.ems.master.controller;

import java.sql.SQLIntegrityConstraintViolationException;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ems.master.dao.EnterpriseDao;
import com.ems.master.model.Enterprise;

@Controller
public class MasterController {

    @Autowired
    EnterpriseDao edao;

    @GetMapping("/")
    public String index() {
        return "Pages/index.html";
    }

    @RequestMapping("/Register")
    public String register() {
        return "Pages/AddEnterprise.html";
    }

    @RequestMapping("/AddEnterprise")
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public String addEnterprise(ModelMap model, @RequestParam("entName") String entName,
            @RequestParam("entDesc") String entDesc, @RequestParam("owner") String owner,
            @RequestParam("contact") String contact, @RequestParam("code") String code,
            @RequestParam("contactNo") String contactNo, @RequestParam("contactEmail") String contactEmail) {
        try {
            Enterprise ent = new Enterprise();
            ent.setEnterpriseName(entName);
            ent.setEnterpriseDesc(entDesc);
            ent.setOwner(owner);
            ent.setContactPerson(contact);
            ent.setContactNo(code + "-" + contactNo);
            ent.setContactEmail(contactEmail);
            ent.setStatus("Active");
            edao.insert(ent);
            model.put("status", ent.getEnterpriseName() + " registered successfully.");
            return "Pages/Homepage.html";
        } catch (SQLIntegrityConstraintViolationException ex) {
            model.put("error", ex.getMessage());
            return "Pages/AddEnterprise.html";
        }
    }

}

Please suggest me what to?

  • Have you tried https://www.baeldung.com/spring-boot-custom-error-page ? – Ihar Sadounikau Aug 31 '19 at 18:42
  • Yes, I have tried that. But it doesn't solve my problem. I want to return the error message to the same page. But this method just shows to create a custom web page. – Ronauk Maharana Aug 31 '19 at 19:23
  • @ExceptionHandler goes with controller advice & not on individual methods. I think you got a wrong exception handling setup. Try commenting ` @ExceptionHandler` line or implement controller advice which can handle the unique constraint exception. – vmasule Sep 01 '19 at 06:57
  • What do you thing about implementation of solution on front end side? After the api call to backend, you can provide any object as an answer with ErrorHandler and ResponseEntity, then you can handle it with custom error handling at the page. – Ihar Sadounikau Sep 01 '19 at 15:19

1 Answers1

1

I think that you need RedirectAttributes, please check this link: RedirectAttributes: addAttribute() vs addFlashAttribute()

@RequestMapping("/AddEnterprise")
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public String addEnterprise(ModelMap model, @RequestParam("entName") String entName,
            @RequestParam("entDesc") String entDesc, @RequestParam("owner") String owner,
            @RequestParam("contact") String contact, @RequestParam("code") String code,
            @RequestParam("contactNo") String contactNo, @RequestParam("contactEmail") String contactEmail, RedirectAttributes redirectAttrs) {
        try {
            Enterprise ent = new Enterprise();
            ent.setEnterpriseName(entName);
            ent.setEnterpriseDesc(entDesc);
            ent.setOwner(owner);
            ent.setContactPerson(contact);
            ent.setContactNo(code + "-" + contactNo);
            ent.setContactEmail(contactEmail);
            ent.setStatus("Active");
            edao.insert(ent);
            model.put("status", ent.getEnterpriseName() + " registered successfully.");
            return "Pages/Homepage.html";
        } catch (SQLIntegrityConstraintViolationException ex) {

            redirectAttrs.addAttribute("error", ex.getMessage());

            return "redirect:/Register";
        }
    }
Ismayil Ibrahimov
  • 440
  • 1
  • 7
  • 11