Java – 500 Внутренняя ошибка сервера: указанный идентификатор не должен быть нулевымJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java – 500 Внутренняя ошибка сервера: указанный идентификатор не должен быть нулевым

Сообщение Anonymous »

РЕШЕНО- Оказывается, лучше всего, чтобы первый символ свойств JSON, а также поле в вашем классе начинались со строчной буквы, чего не было в случае с пустым полем.
Я внесу исправления в исходный вопрос
Я работаю с книгами и авторами специально для API, где я использую Java Spring Boot и Spring JPA со спящим режимом с MySQL база данных.
Мой книжный класс:

Код: Выделить всё

@Entity
public class Book {
@Id
private String isbn; //Was formally set to 'ISBN'

@ManyToMany
@JoinTable(
name="books_orders",
joinColumns =  @JoinColumn(name="book_isbn"),
inverseJoinColumns = @JoinColumn(name="order_id")
)
private Set orders = new HashSet();

@ManyToMany(cascade = CascadeType.PERSIST)
@JoinTable(
name="books_authors",
joinColumns = @JoinColumn(name = "book_isbn"),
inverseJoinColumns = @JoinColumn(name = "author_id")
)
private Set authors = new HashSet();

public String getIsbn() {
return isbn;
}

public void setIsbn(String isbn) {
this.Isbn = isbn;
}

public Set getAuthors() {
return authors;
}

public void setAuthors(Set authors) {
this.authors = authors;
}
Мой авторский класс:

Код: Выделить всё

@Entity
public class Author {
@Id
private long id;
@ManyToMany(mappedBy="authors")
private Set books = new HashSet();

private String name;
private int birthyear;
private String nationality;

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getBirthyear() {
return birthyear;
}

public void setBirthyear(int birthyear) {
this.birthyear = birthyear;
}

public String getNationality() {
return nationality;
}

public void setNationality(String nationality) {
this.nationality = nationality;
}

public Set getBooks() {
return books;
}

public void setBooks(Set books) {
this.books = books;
}
}
Полезная нагрузка JSON для книги:

Код: Выделить всё

{
"isbn": "ISBN1",
"authors": [
{"id": 47, "name": "Eichiro Oda", "birthyear": 1976, "nationality": "Japanese"}
],
"title": "One piece",
"publicationYear": 1999,
"price": 100.00
}
Метод контроллера, обрабатывающий создание книги:

Код: Выделить всё

    @PostMapping("/")
public ResponseEntity createBook(@RequestBody Book book, UriComponentsBuilder ucBuilder) {
if (bRepo.existsById(book.getIsbn())) {
return new ResponseEntity(new ErrorResponse("The book named " + book.getTitle() + "  already exists."), HttpStatus.CONFLICT);
}
bRepo.save(book);
HttpHeaders headers = new HttpHeaders();
headers.setLocation(ucBuilder.path("/api/book/{ISBN}").buildAndExpand(book.getIsbn()).toUri());
return new ResponseEntity(headers, HttpStatus.CREATED);
}
Когда я тестирую конечную точку POST с телом запроса книги для создания книги, я получаю следующую ошибку:

Код: Выделить всё

{
"timestamp": "2024-04-22T22:37:17.571+00:00",
"status": 500,
"error": "Internal Server Error",
"trace": "org.springframework.dao.InvalidDataAccessApiUsageException:  T h e   g i v e n   i d   m u s t   n o t   b e   n u l l \ n \ t a t   o r g . s p r i n g f r a m e w o r k . o r m . j p a . E n t i t y M a n a g e r F a c t o r y U t i l s . c o n v e r t J p a A c c e s s E x c e p t i o n I f P o s s i b l e ( E n t i t y M a n a g e r F a c t o r y U t i l s . j a v a : 3 7 1 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . o r m . j p a . v e n d o r . H i b e r n a t e J p a D i a l e c t . t r a n s l a t e E x c e p t i o n I f P o s s i b l e ( H i b e r n a t e J p a D i a l e c t . j a v a : 2 4 6 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . o r m . j p a . A b s t r a c t E n t i t y M a n a g e r F a c t o r y B e a n . t r a n s l a t e E x c e p t i o n I f P o s s i b l e ( A b s t r a c t E n t i t y M a n a g e r F a c t o r y B e a n . j a v a : 5 5 0 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . d a o . s u p p o r t . C h a i n e d P e r s i s t e n c e E x c e p t i o n T r a n s l a t o r . t r a n s l a t e E x c e p t i o n I f P o s s i b l e ( C h a i n e d P e r s i s t e n c e E x c e p t i o n T r a n s l a t o r . j a v a : 6 1 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . d a o . s u p p o r t . D a t a A c c e s s U t i l s . t r a n s l a t e I f N e c e s s a r y ( D a t a A c c e s s U t i l s . j a v a : 3 3 5 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . d a o . s u p p o r t . P e r s i s t e n c e E x c e p t i o n T r a n s l a t i o n I n t e r c e p t o r . i n v o k e ( P e r s i s t e n c e E x c e p t i o n T r a n s l a t i o n I n t e r c e p t o r . j a v a : 1 5 2 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . a o p . f r a m e w o r k . R e f l e c t i v e M e t h o d I n v o c a t i o n . p r o c e e d ( R e f l e c t i v e M e t h o d I n v o c a t i o n . j a v a : 1 8 4 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . d a t a . j p a . r e p o s i t o r y . s u p p o r t . C r u d M e t h o d M e t a d a t a P o s t P r o c e s s o r $ C r u d M e t h o d M e t a d a t a P o p u l a t i n g M e t h o d I n t e r c e p t o r . i n v o k e ( C r u d M e t h o d M e t a d a t a P o s t P r o c e s s o r . j a v a : 1 6 4 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . a o p . f r a m e w o r k . R e f l e c t i v e M e t h o d I n v o c a t i o n . p r o c e e d ( R e f l e c t i v e M e t h o d I n v o c a t i o n . j a v a : 1 8 4 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . a o p . i n t e r c e p t o r . E x p o s e I n v o c a t i o n I n t e r c e p t o r . i n v o k e ( E x p o s e I n v o c a t i o n I n t e r c e p t o r . j a v a : 9 7 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . a o p . f r a m e w o r k . R e f l e c t i v e M e t h o d I n v o c a t i o n . p r o c e e d ( R e f l e c t i v e M e t h o d I n v o c a t i o n . j a v a : 1 8 4 ) \ n \ t a t   o r g . s p r i n g f r a m e w o r k . a o p . f r a m e w o r k . J d k D y n a m i c A o p P r o x y . i n v o k e ( J d k D y n a m i c A o p P r o x y . j a v a : 2 2 0 ) \ n \ t a t   j d k .proxy4/jdk.proxy4.$Proxy118.existsById(Unknown Source)\n\tat edu.leicester.co2103.part1s2.controller.BookRestController.createAuthor(BookRestController.java:83)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:925)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:830)\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\n\tat java.base/java.lang.Thread.run(Thread.java:840)\nCaused by:  java.lang.IllegalArgumentException: The given id must not be null\n\tat org.springframework.util.Assert.notNull(Assert.java:172)\n\tat org.springframework.data.jpa.repository.support.SimpleJpaRepository.existsById(SimpleJpaRepository.java:342)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:351)\n\tat org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277)\n\tat org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170)\n\tat org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158)\n\tat org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516)\n\tat org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285)\n\tat org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628)\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\n\tat org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168)\n\tat org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143)\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\n\tat org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)\n\tat org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:392)\n\tat org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\n\tat org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)\n\t... 58 more\n",
"message": "The given id must not be null",
"path": "/books/"
}

Когда я отлаживал метод контроллера, я понял, что поле первичного ключа для книги в теле запроса имеет нулевое значение, и решил, что может возникнуть проблема с установкой строковых первичных ключей.

Подробнее здесь: https://stackoverflow.com/questions/783 ... ot-be-null
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»