2

I'm attempting to create an Axio POST request that sends an object to a Spring Boot server so that the object can then be saved to a database.

I've gone over the code several times and read several tutorials on the matter but all of them seem to keep giving conflicting information on what to do. I'll link the more notable ones down below since it's possible that I missed something.

The code is heavily shortened to only include the pieces that are relevant.

Frontend:

React.js - AddNewBookPane


    const addNewBookToDatabase = async () => {
        const book = {
          authorID: bookAuthor,
          publisherID: bookPublisher,
          title: bookTitle,
          copyright: bookCopyright,
          isbn: bookISBN,
          edition: bookEdition,
          genreID: bookGenre,
          seriesID: bookSeries,
          series_part: bookSeriesPart,
          format: bookFormat,
          pages: bookPages,
          languageID: bookLanguage
    
        }
        console.log(book);
        const response = await libraryService.createNewBook(book)
        .catch(error => {
          console.error("The following error occured!", error);
        });
        console.log(response);
      }

The frontend code seems entirely correct to me and the information I can find seems to prove this. The object itself is created with no issues and all the fields are filled correctly. The error codes that I recieve when I attempt to send a form all return an html error 500 which clearly indicates that the information is making its way to the server but runs into an issue upon arrival.

The methods for creating the axios request is abstracted but the final structure is post("http://localhost:8080/books/create", {book});

Backend:

BookServiceImpl


    @Override
    public Book createBook(Book book) {
        return bookRepository.save(book);
    }

BookServiceController


    @PostMapping(path="/create")
    public Book createBook(@RequestBody Book book) {
        return bookServicesImpl.createBook(book);
    }

These are the two classes that interact with the incoming request. There is an interface and the @Entity class as well but neither seemed important enough to include.

Thoughts:

Whenever I attempt to submit a request on the website, the server immediately gives an error that says Column 'title' can't be null. When I told the method to print the value of the book's "title" variable, it returned "null" every time. All of this combined tells me that the request is indeed making its way to the server but simply isn't being acknowledged when it arrives. I'm not sure what is being done wrong but I would really like to know.

I've included the last stack trace as well.

2022-07-02 14:40:06.254  INFO 15016 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat-3].[localhost].[/]     : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-07-02 14:40:06.254  INFO 15016 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-07-02 14:40:06.254  INFO 15016 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
2022-07-02 14:40:06.271  WARN 15016 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1048, SQLState: 23000
2022-07-02 14:40:06.271 ERROR 15016 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : Column 'title' cannot be null
2022-07-02 14:40:06.271  INFO 15016 --- [nio-8080-exec-1] o.h.e.j.b.internal.AbstractBatchImpl     : HHH000010: On release of batch it still contained JDBC statements
2022-07-02 14:40:06.277 ERROR 15016 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause

java.sql.SQLIntegrityConstraintViolationException: Column 'title' cannot be null
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-4.0.3.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3375) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3908) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:107) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[na:na]
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:344) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1407) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:489) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3290) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2425) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:449) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:562) ~[spring-orm-5.3.19.jar:5.3.19]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:743) ~[spring-tx-5.3.19.jar:5.3.19]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) ~[spring-tx-5.3.19.jar:5.3.19]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:654) ~[spring-tx-5.3.19.jar:5.3.19]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:407) ~[spring-tx-5.3.19.jar:5.3.19]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.19.jar:5.3.19]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.19.jar:5.3.19]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.19.jar:5.3.19]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.19.jar:5.3.19]
    at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61) ~[spring-data-commons-2.6.4.jar:2.6.4]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.19.jar:5.3.19]
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174) ~[spring-data-jpa-2.6.4.jar:2.6.4]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.19.jar:5.3.19]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.19.jar:5.3.19]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.19.jar:5.3.19]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.19.jar:5.3.19]
    at com.sun.proxy.$Proxy297.save(Unknown Source) ~[na:na]
    at jweb.coding.LibraryWebsite.Services.BookServiceImpl.createBook(BookServiceImpl.java:25) ~[classes/:na]
    at jweb.coding.LibraryWebsite.Controllers.BookServiceController.createBook(BookServiceController.java:50) ~[classes/:na]
    at jweb.coding.LibraryWebsite.Controllers.BookServiceController$$FastClassBySpringCGLIB$$b01e983.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.19.jar:5.3.19]
    at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.19.jar:5.3.19]
    at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.19.jar:5.3.19]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704) ~[spring-aop-5.3.19.jar:5.3.19]
    at jweb.coding.LibraryWebsite.Controllers.BookServiceController$$EnhancerBySpringCGLIB$$82713a65.createBook(<generated>) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.19.jar:5.3.19]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.19.jar:5.3.19]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.19.jar:5.3.19]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.19.jar:5.3.19]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.19.jar:5.3.19]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.19.jar:5.3.19]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.19.jar:5.3.19]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.19.jar:5.3.19]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.19.jar:5.3.19]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.19.jar:5.3.19]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:681) ~[tomcat-embed-core-9.0.62.jar:4.0.FR]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.19.jar:5.3.19]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.62.jar:4.0.FR]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.62.jar:9.0.62]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.19.jar:5.3.19]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.19.jar:5.3.19]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.19.jar:5.3.19]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.19.jar:5.3.19]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.19.jar:5.3.19]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.19.jar:5.3.19]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]


Links:

Spring – @GetMapping and @PostMapping

React + Axios - HTTP POST Request Examples

Spring Boot and React

Updates:

This is a quick update of some of the other things I've attempted.

The first thing is I changed the method in the controller from

 @PostMapping(path="/create")
    public Book createBook(@RequestBody Book book) {
        return bookServicesImpl.createBook(book);
    }

to

 @PostMapping(path="/create")
    public ResponseEntity<Book> createBook(@RequestBody Book book) {
        return bookServicesImpl.createBook(book);
    }

My reasoning for this was that it would bring it in line with all of my other methods but had no effect whatever.

Another thing I tried was converting the two seperate methods into a single large one as well as attempting to call the getTitle(), getAuthorID(), and book.getPublisherID() to create a "minimum viable book" class of sorts but it still returns the same error regardless; "Column 'title' cannot be null".

public ResponseEntity<Book> createBook(@RequestBody Book book) {
        try {
            Book newBook = bookRepository.save(new Book(book.getTitle(),book.getAuthorID(),book.getPublisherID()));
            return new ResponseEntity<>(newBook, HttpStatus.CREATED);
        } catch (Exception e) {
            return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

I've included both the error response message from the website as well as a log of the POST request from the server's console. They may shine some light on the issue.

Reponse Error Message

The following error occured! 
Object { message: "Request failed with status code 500", name: "AxiosError", code: "ERR_BAD_RESPONSE", config: {…}, request: XMLHttpRequest, response: {…}, stack: "" }
​
code: "ERR_BAD_RESPONSE"
​
config: Object { timeout: 0, xsrfCookieName: "XSRF-TOKEN", xsrfHeaderName: "X-XSRF-TOKEN", … }
​
message: "Request failed with status code 500"
​
name: "AxiosError"
​
request: XMLHttpRequest { readyState: 4, timeout: 0, withCredentials: false, … }
​
response: Object { data: "", status: 500, statusText: "", … }
​
stack: ""
​
<prototype>: Object { constructor: o(e, t, n, r, o), toJSON: toJSON(), stack: "", … }
react_devtools_backend.js:4026:25

Server Console Log Message:

o.s.w.f.CommonsRequestLoggingFilter      : After request [POST /books, client=127.0.0.1, payload={"book":{"authorID":4,"publisherID":7,"title":"test","seriesID":""}}]

New Updates 6:56 CS:

Thanks to some input from @CaptainPyscho, I was able to get the issue with the payload resolved but now a new error has appeared. The error is as follows...

2022-07-03 18:54:32.552  WARN 4228 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1062, SQLState: 23000
2022-07-03 18:54:32.552 ERROR 4228 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : Duplicate entry '52' for key 'book.PRIMARY'
2022-07-03 18:54:32.552  INFO 4228 --- [nio-8080-exec-2] o.h.e.j.b.internal.AbstractBatchImpl     : HHH000010: On release of batch it still contained JDBC statements
2022-07-03 18:54:32.553 DEBUG 4228 --- [nio-8080-exec-2] o.s.w.f.CommonsRequestLoggingFilter      : After request [POST /books, client=127.0.0.1, payload={"title":"whatever","authorID":5,"publisherID":5}]

I understand this to be an issue that could arise if an entity's key is not properly set but the Book entity on my server has had this value assigned since day one. I've included a section of the class itself below to show it.

@Entity
public class Book {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    int bookID;
    
    @NotEmpty
    String title;
    String isbn;

The variable "bookID" is working as intended for other methods too. For example, when I use an API to get all of the books off the database an into Postman, they all show up with their appropriate IDs as they appear in the database itself.

I'm not entirely sure why this issue is occuring but by all accounts, it shouldn't.

I'll keep working on this but any input would be greatly appreciated.

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
TeaDrinker
  • 199
  • 1
  • 11
  • Have you check the console.log(book) inside FE axio call and also log request 'book' inside controller just before call createBook()? Do you get the title you set in both? – DevThiman Jul 03 '22 at 03:25
  • @DevThiman Assuming I understand your question correctly, then yes. Inside the Controller's @PostMapping method, I did have a `System.out.println(book.getTitle());` to see what the value was and it always printed a "null" in the console. The `console.log(book)` always showed the value I assigned it in the website's form prior to hitting the submit button. – TeaDrinker Jul 03 '22 at 14:14
  • You can try logging to the console the request that the server gets, to make sure that the data that you send form the client is correct – jon doe Jul 03 '22 at 15:18
  • @jondoe I've not yet been able to find a way to properly do this. Everytime I look into it, I get several different solutions and lots of arguments over what does what. `CommonsRequestLoggingFilter` seems to have the most promise but I'm continuing to read more into this and will update when I have a solution. – TeaDrinker Jul 03 '22 at 16:24
  • @jondoe I was able to get a filter working and at first glance, everything does appear to be in order. The title field certainly isn't null at the very least. – TeaDrinker Jul 03 '22 at 16:35
  • Error is clear `java.sql.SQLIntegrityConstraintViolationException: Column 'title' cannot be null` – CaptainPyscho Jul 03 '22 at 17:33
  • @CaptainPyscho I agree. That certainly is the error but the real problem is what would be causing that. There are multiple indicators that the “title” field of the object “book” in the POST request is not null at all. The biggest one being the console log from the server at the end of the update section of the post. – TeaDrinker Jul 03 '22 at 18:12
  • @TeaDrinker so all other book properties you send from client get as it is and only 'title' get as null, is it? Can you also provide your 'Book Entity' class? – DevThiman Jul 03 '22 at 18:36
  • @DevThiman I’ve added a section of the Book Entity – TeaDrinker Jul 04 '22 at 01:12

1 Answers1

2

Controller expects the body of your request be the properties of a Book, so try this:

payload={"authorID":4,"publisherID":7,"title":"test","seriesID":""}

If you don't want to change your React code, you could change the parameter of your controller method like this:

public Book createBook(@RequestBody CustomRequestBody body)

Your CustomRequestBody would be:

public class CustomRequestBody {
   private Book book;

   //Setter and getter methods
}
CaptainPyscho
  • 338
  • 1
  • 7
  • I got axios to send just the values in an unlabeled object like you indicated in your suggestion. That does seem to have fixed the issue but I can't be sure. It's no longer showing that the title is null and is in fact showing as intended but now it's returning a new error for MySQL. I'll have more details above in the original post. – TeaDrinker Jul 04 '22 at 00:06
  • @TeaDrinker Try changing the initial autoincrement value of the Book table to a value that has not been used, for example `ALTER TABLE Book AUTO_INCREMENT=53; ` – CaptainPyscho Jul 04 '22 at 01:30
  • Okay, so I set the generationType of the book entity to "IDENTITY" and that appears to have solved it. I was able to add a book object to the database. I'm not going to call this problem solved just yet since I want to do some more testing before I say for certain. I wanted to let you know what was going on though and will reply soon with an update. Thanks! – TeaDrinker Jul 04 '22 at 02:08
  • I'm not sure what happened but now I have an entirely new problem to deal with. Something to do with Spring returning the error `java.lang.NoClassDefFoundError: org/springframework/validation/annotation/ValidationAnnotationUtils` even though the validator dependencies are in the pom.xml file and this wasn't an issue until this morning. But that's a separate issue from this question so I'm going to have to figure that one out later. There was a very brief moment in time though where your solution did fix the issue so thanks for your help! – TeaDrinker Jul 04 '22 at 13:06