#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); });