Не удалось создать экземпляр , параметр bookTitle

#reactjs #spring #kotlin

Вопрос:

хорошо, я пытаюсь отправить файл с 2 строковыми объектами с помощью axios на мой контроллер spring. Я использую те же имена переменных, поэтому я понятия не имею, почему я получаю эту ошибку

«Не удалось создать экземпляр [com.onlinelibrary.bookservice.dto.сообщения.Сообщения$AddBookRequestMessage]: Конструктор выдал исключение; вложенное исключение-java.lang.Исключение NullPointerException: Параметр, указанный как ненулевой, равен нулю: метод com.onlinelibrary.bookservice.dto.сообщения.Сообщения$AddBookRequestMessage., параметр bookTitle»

 const ManageBooksTab = () =gt; {  const [book, setBook] = useState() const [bookTitle, setBookTitle] = useState('') const [bookDescription, setBookDescription] = useState('') const [addDisabled, setAddDisabled] = useState(true) const [deleteDisabled, setDeleteDisabled] = useState(true)    const handleBookAddSubmit = (e) =gt; {  e.preventDefault();   console.log(book , bookTitle, bookDescription)   const body = {  bookTitle: bookTitle,  bookDescription: bookDescription,  bookFile: book  }   axios.post('http://localhost:8989/books/add', body, APIService.config).then(response =gt; {  console.log(response.data)  }).catch((err) =gt; {  console.warn('error during http call adding book', err);  console.warn('error during http call adding book Response: ', err.response);  }); }  const handleBookDeleteSubmit = (e) =gt; {  e.preventDefault();   axios.get(`http://localhost:8989/books/delete/${e.target.value}`, APIService.config).then( response =gt; {  console.log(response.data)  }).catch((err) =gt; {  console.warn('error during http call deleting book', err);  console.warn('error during http call deleting book Response: ', err.response);  }); }  const handleFileChange = (e) =gt; {  setBook(e.target.value) }  const handleDeleteSelection = (e) =gt; {  setDeleteDisabled(false) }  const [books, setBooks] = useState([])  useEffect(e =gt; {  APIService.getAccessibleData()  .then(response =gt; {  console.log(response.data)  setBooks(response.data)  }).catch(function (ex) {  console.log('User Response parsing failed. Error: ', ex);  console.log('User Response parsing failed. Error: Server Response', ex.response);  }); }, [])  return (  lt;gt;  lt;Container className="col-5"gt;  lt;Form.Group controlId="formFileLg" className="mb-3"gt;  lt;Form.Labelgt; lt;stronggt;Add Booklt;/stronggt; lt;/Form.Labelgt;  lt;br/gt;  lt;Form.Labelgt;Book Titlelt;/Form.Labelgt;  lt;Form.Control type="textfield" onChange={e =gt; setBookTitle(e.target.value)} placeholder='Enter Title'/gt;  lt;Form.Labelgt;Book Descriptionlt;/Form.Labelgt;  lt;Form.Control type="textarea" onChange={e =gt; setBookDescription(e.target.value)} placeholder='Enter Description'/gt;   lt;Form.Labelgt;Upload Book PDFlt;/Form.Labelgt;  lt;Form.Control type="file" size="lg" onChange={e =gt; {handleFileChange(e)}}/gt;  lt;br/gt;  lt;Button variant="primary" type="submit" onClick={(e) =gt; handleBookAddSubmit(e)}gt;  Add Book  lt;/Buttongt;  lt;/Form.Groupgt;   lt;hr/gt;  lt;br/gt;  lt;Form.Group controlId="formFileLg" className="mb-3"gt;  lt;Form.Labelgt; lt;stronggt;Delete Booklt;/stronggt; lt;/Form.Labelgt;  lt;br/gt;  lt;Form.Labelgt;Select Book to deletelt;/Form.Labelgt;  lt;Form.Control as="select"gt;  {  books.map((bookIndex,index) =gt; {  return (  lt;option value={bookIndex.id} key={index}gt;{bookIndex.bookTitle} : {bookIndex.id}lt;/optiongt;  )  })  }  lt;/Form.Controlgt;  lt;br/gt;  lt;Button variant="primary" type="submit" onChange={e =gt; handleDeleteSelection(e)} onClick={(e) =gt; handleBookDeleteSubmit(e)}gt;  Delete Book  lt;/Buttongt;  lt;/Form.Groupgt;  lt;/Containergt;  lt;/gt; )  

}

вот мой метод контроллера

 @PostMapping("/add") @Throws(UserException::class, AWSException::class, AccessException::class, BookException::class) fun addBook(  @ModelAttribute message: AddBookRequestMessage,  bindingResult: BindingResult ): ResponseEntitylt;BookAddResponseMessagegt; {  bindErrorResult(bindingResult)  return ResponseEntity.ok(bookService.addBook(message)) }  

и класс данных, который я запрашиваю у своего клиента react

 data class AddBookRequestMessage(  val bookTitle: String,  val bookDescription: String,  val bookFile: MultipartFile )  

я понятия не имею, что я делаю не так, может ли кто-нибудь помочь мне с этим? и, пожалуйста, не стесняйтесь спрашивать, нужно ли что-нибудь еще PS я попробовал свой контроллер с данными формы в postman, и он работает нормально, у меня проблема с реакцией

Ответ №1:

Эй, я просто неправильно загружал файл здесь

 const handleFileChange = (e) =gt; { setBook(e.target.value)  

}

где это должно быть

 const handleFileChange = (e) =gt; {  setBook(e.target.files[0]) }  

также необходимо извлекать данные, подобные этим, в данных формы

 const formData = new FormData()   formData.append('bookTitle', bookTitle)  formData.append('bookDescription', bookDescription)  formData.append('bookFile', book)    axios.post('http://localhost:8989/books/add', formData, APIService.config).then(response =gt; {  console.log(response.data)  }).catch((err) =gt; {  console.warn('error during http call adding book', err);  console.warn('error during http call adding book Response: ', err.response);  });