P.K.Hindustani
P.K.Hindustani

Reputation: 148

how to handle DuplicateKeyException in Spring data mongodb

Method to insert data

    public  String home()  {

    try
    {
    MongoData data=new MongoData();
    data.setDate(new Date());
    data.setName("frji");

    //mongoTemplate.insert(data);
    mongoTemplate.save(data);
    }
    catch (DuplicateKeyException e) {

    }
    catch (MongoException e) {

    }
    return "home";
}

Entity class

  @Document(collection="integer_test")
public class MongoData {
    @Id
    private String id;
    private Date date;
    @Indexed(unique=true)
    private String name;
    @Override
    public String toString() {
        return "MongoData [date=" + date + ", id=" + id + "]";
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

But it does not catch the exception. it will show on user interface.Then how can i catch this exception in java end.

com.mongodb.MongoException$DuplicateKey: { "serverUsed" : "192.168.1.113:27017" , "ok" : 1 , "n" : 0 , "err" : "E11000 duplicate key error index: jmailer_digiengage.integer_test.$name dup key: { : \"frji\" }" , "code" : 11000} at com.mongodb.CommandResult.getWriteException(CommandResult.java:88) at com.mongodb.CommandResult.getException(CommandResult.java:79) at com.mongodb.DBCollectionImpl.translateBulkWriteException(DBCollectionImpl.java:415) at com.mongodb.DBCollectionImpl.insertImpl(DBCollectionImpl.java:210) at com.mongodb.DBCollection.insert(DBCollection.java:176) at com.mongodb.DBCollection.insert(DBCollection.java:161) at com.mongodb.DBCollection.insert(DBCollection.java:107) at com.mongodb.DBCollection.save(DBCollection.java:1214) at com.mongodb.DBCollection.save(DBCollection.java:1179) at org.springframework.data.mongodb.core.MongoTemplate$11.doInCollection(MongoTemplate.java:1106) at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:479) at org.springframework.data.mongodb.core.MongoTemplate.saveDBObject(MongoTemplate.java:1101) at org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:1034) at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:981) at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:969) at com.mongo.test.HomeController.home(HomeController.java:62) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:111) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:729) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 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.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1441) 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)

Upvotes: 4

Views: 20033

Answers (3)

Mehraj Malik
Mehraj Malik

Reputation: 15854

You can create your HandlerExceptionResolver to handle and show the user friendly message to the UI.

How to create HandlerExceptionResolver

Update : If you just want to handle the exception then write org.springframework.dao.DuplicateKeyException in the catch block.

try{
  //TODO
} catch(org.springframework.dao.DuplicateKeyException e){
 //TODO - Do what you want
}

Upvotes: 8

Kanika Sharma
Kanika Sharma

Reputation: 137

Answering quite late, but might help somebody. Extending Mehraj Malik answer here,

another way is to catch exceptions and check inside if it is Duplicate or any other exception. In this way we can check for any other exception as well:

import org.springframework.dao.DuplicateKeyException;

try {
// 
} catch(Exception ex) {
 log.info("Exception occurred: ", ex); //to log exception
  if(ex instanceof DuplicateKeyException) {
      // duplicate key exception exists
  } else {
  // do something else
  }

}

Upvotes: 0

robjwilkins
robjwilkins

Reputation: 5652

How do you know it does not catch the exception? Your exception handling code doesn't do anything!

You need to add something meaningful to actually do something when a duplicate exception occur

public  String home()  {
  try {
    MongoData data=new MongoData();
    data.setDate(new Date());
    data.setName("frji");
    mongoTemplate.save(data);
  } catch (DuplicateKeyException | MongoException e) {
    //Exception handling
    return "an error occurred: " + e.getMessage();
  }
  return "home";
} 

Or remove the exception handling, and let the exception be thrown.

public  String home()  {
  MongoData data=new MongoData();
  data.setDate(new Date());
  data.setName("frji");
  mongoTemplate.save(data);
  return "home";
} 

Upvotes: 0

Related Questions