-2

I am trying to update in the database with the help of the Spring JPA and having an issue while doing it. I have an Embedded class in my entity. My entity class is :

@Entity
@Data
public class Users extends AbstractEntity {
    private String name;
    private String email;
    private Audit audit;
    private TransferDetails transferDetails;
    private BeneficiaryDetails beneficiaryDetails;
}

My Repository class is :

public interface UserRepo extends JpaRepository<Users, Long> {
}

Audit, Transfer and Beneficiary Details are my Emededded class and those are :

@Embeddable
@Data
public class Audit {
    private String createdBy;
    private Date createdDate;
}
@Data
@Embeddable
public class BeneficiaryDetails {
    private String BeneficiaryName;

    public String getBeneficiaryName() {
        return BeneficiaryName;
    }

    public void setBeneficiaryName(String beneficiaryName) {
        BeneficiaryName = beneficiaryName;
    }
}
@Data
@Embeddable
public class TransferDetails {
    @Column(name = "TransferCurrency")
    private String TransferCurrency;
    private String ChequeCurrency;
}

My Controller class is:

@RestController
@RequestMapping("/api/v1/Users")
public class UserController {

    private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);
    @Autowired
    private UserRepo userRepo;

    @GetMapping("/users/{id}")
    public ResponseEntity<Users> getTutorialById(@PathVariable("id") long id) {
        Optional<Users> userData = userRepo.findById(id);

        if (userData.isPresent()) {
            return new ResponseEntity<>(userData.get(), HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    @PostMapping(path = "/saveData", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Users> createTutorial(@RequestBody Users users) {
        try {
            LOGGER.info("Starting to save the form.....");
            return new ResponseEntity<>(userRepo.save(users), HttpStatus.CREATED);
        } catch (Exception e) {
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    @Transactional
    @PutMapping("/updateData/{id}")
    public ResponseEntity<Users> updateTutorial(@PathVariable("id") long id, @RequestBody Users users) {
        try {
            Optional<Users> userRepoById = userRepo.findById(id);
            LOGGER.info("Starting to update the form.....");
            if (userRepoById.isPresent()) {
                Users _users = userRepoById.get();
                _users.setName(users.getName());
                _users.setEmail(users.getEmail());
                _users.setAudit(users.getAudit());
                LOGGER.info("getTransferCurrency --> " + users.getTransferDetails().getTransferCurrency());
                LOGGER.info("getChequeCurrency --> " + users.getTransferDetails().getChequeCurrency());
                **_users.getTransferDetails().setTransferCurrency(users.getTransferDetails().getTransferCurrency());**
                LOGGER.info("getBeneficiaryName --> " + users.getBeneficiaryDetails().getBeneficiaryName());
                _users.getBeneficiaryDetails().setBeneficiaryName(users.getBeneficiaryDetails().getBeneficiaryName());
                return new ResponseEntity<>(userRepo.save(_users), HttpStatus.OK);
            } else {
                return new ResponseEntity<>(HttpStatus.NOT_FOUND);
            }
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
            String str = "";
            for (int i = 0; i < (e.getStackTrace().length); i++)
                str = str + e.getStackTrace()[i] + " <br> ";
            System.out.println("EXP MSG: " + str);
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

}

My error stack trace is :

sa.project.sabb.controller.UserController.updateTutorial(UserController.java:60)  
sa.project.sabb.controller.UserController$$FastClassBySpringCGLIB$$c1b6e8ae.invoke(<generated>)  
 org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)  
 org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779)  
 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)  
 org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)  
 org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)  
 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)  
 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)  
 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)  
 org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)  
 org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692)  
 sa.project.sabb.controller.UserController$$EnhancerBySpringCGLIB$$51f2328.updateTutorial(<generated>)  
 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)  
 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
 java.lang.reflect.Method.invoke(Method.java:498)  
 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)  
 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)  
 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)  
 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)  
 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)  
 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)  
 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064)  
 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)  
 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)  
 org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)  
 javax.servlet.http.HttpServlet.service(HttpServlet.java:684)  
 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)  
 javax.servlet.http.HttpServlet.service(HttpServlet.java:764)  
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)  
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)  
 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)  
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)  
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)  
 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)  
 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)  
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)  
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)  
 org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)  
 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)  
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)  
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)  
 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)  
 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)  
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)  
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)  
 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)  
 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)  
 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)  
 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)  
 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)  
 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)  
 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)  
 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)  
 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)  
 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)  
 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1726)  
 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)  
 org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)  
 org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)  
 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)  
 java.lang.Thread.run(Thread.java:748)  

What I understand is that I have some null values in the columns of DB and I am trying to update them. Is there something I am missing? Could someone me help in this regard? Any help will be much appreciated. Thanks

Tabish Hafeez
  • 93
  • 1
  • 12

2 Answers2

1

Have you tried this?

TransferDetails td = users.getTransferDetails();
if(td != null) {
    TransferDetails _td = _users.getTransferDetails();
    if(_td != null) {
        _td.setTransferCurrency(td.getTransferCurrency());
    } else {
        _td = new TransferDetails();
        _td.setTransferCurrency(td.getTransferCurrency());
        _users.setTransferDetails(_td);
    }
}
Yu Hao
  • 119,891
  • 44
  • 235
  • 294
Adeel Ansari
  • 39,541
  • 12
  • 93
  • 133
0

By reading the code, I see _users.getTransferDetails(). is null. Because, the logger above didn't throw null pointer exception where you're printing users.getTransferDetails().

Set value of TransferDetails only when it is not null like:

// You need to check if the 
// `_user.getTransferDetails` is not null, 
// then only you can call `setTransferCurrency` of that object. 
// Otherwise you'll end up with a NullPointerException.
if(_users.getTransferDetails() !=null) 
            _users.getTransferDetails().setTransferCurrency(users.getTransferDetails().getTransferCurrency());
Mansoor
  • 1,157
  • 10
  • 29
  • as I have mentioned it will be a case in our scenario and it will happen a lot and I have almost 60 columns that might be null and might be it has some values. How to deal that in spring jpa? – Tabish Hafeez Oct 24 '21 at 15:27
  • What if I want to update that column? it will always not update whenever it has a null value. I want to update in that case as well. – Tabish Hafeez Oct 24 '21 at 15:28
  • Can you try marking the embedded objects with nullable annotation?Try adding @Column(nullable = true) – Aravind R Oct 24 '21 at 15:34
  • The issue is not with the column, it is the issue with the `TransferDetails` object. When you try to access `setter` of `TransferDetailsObject` when it is `null`. You will always get a `NullPointerException`. Please understand the exception carefully. I am checking if `TransferDetails` is not null of `_users` and not `users` – Mansoor Oct 24 '21 at 15:48
  • https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it – Mansoor Oct 24 '21 at 15:54
  • @AravindR yes I tried that but the error still persists. :( – Tabish Hafeez Oct 24 '21 at 15:59
  • @Mansoor as I have stated in my question as well that I am trying to update the null column and it is giving me an error. So, I have already tried but it's of no use. – Tabish Hafeez Oct 25 '21 at 07:02