#angular #typescript #spring-boot #post #http-status-code-404
Вопрос:
У меня проблема, когда я пытаюсь отправить объект из формы в angular в springboot и базу данных MySQL. Я обнаружил ошибку 404, не найденную. Мой код приведен ниже. Вот код угловой службы:
import { DonatorDTO } from '../models/donatorDTO'; import { HttpHeaders, HttpClient } from "@angular/common/http"; import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class DonatorsService { private watKrewDonationUrl = "http://localhost:8080/donators"; constructor(private _http: HttpClient){} public addDonator(donatorDTO: DonatorDTO): Observablelt;DonatorDTOgt;{ return this._http.postlt;DonatorDTOgt;(this.watKrewDonationUrl, donatorDTO); } }
Вот код углового компонента:
import { DonatorDTO } from './../../models/donatorDTO'; import { DonatorsService } from './../../services/donators.service'; import { Component, OnInit } from '@angular/core'; import { FormBuilder, FormControl, FormGroup, NgForm, Validators } from '@angular/forms'; @Component({ selector: 'app-donators', templateUrl: './donators.component.html', styleUrls: ['./donators.component.css'] }) export class DonatorsComponent implements OnInit { donatorForm: NgForm; constructor(private donatorService: DonatorsService) {} ngOnInit(): void { } donatorDTO: DonatorDTO = new DonatorDTO(); companies: string [] =['1. kompania','2. kompania','3. kompania','4. kompania','5. kompania','6. kompania','7. kompania','8. kompania', '9. kompania','10. kompania','11. kompania','12. kompania','13. kompania','14. kompania','15. kompania','16. kompania', '17. kompania','18. kompania','19. kompania','20. kompania','21. kompania']; bloodGroups: string [] = ['A ', 'A-', 'B ', 'B-', 'AB ', 'AB-', '0 ', '0-']; ranks: string [] = ['szer. pchor.', 'st. szer. pchor.', 'kpr. pchor.', 'st. kpr. pchor.', 'plut. pchor.', 'sierż. pchor.']; createDonator() { console.log(this.donatorDTO); this.donatorService.addDonator(this.donatorDTO).subscribe(data =gt; { console.log(data) }) } }
Вот .html-код
lt;!DOCTYPE htmlgt; lt;html lang="pl-PL"gt; lt;bodygt; lt;div class="container"gt; lt;div class="col-md-6"gt; lt;form #donatorForm="ngForm" (ngSubmit) = "createDonator()" gt; lt;div class="form-group"gt; lt;input type="text" class = "form-control" [(ngModel)]="donatorDTO.name" name="name" placeholder="np. Jan" gt; lt;small id="nameHelp" class="form-text text-muted"gt;Podaj imię dawcylt;/smallgt; lt;/divgt; lt;div class="form-group"gt; lt;input type="text" class = "form-control" [(ngModel)]="donatorDTO.surname" name="surname" placeholder="np. Kowalski" gt; lt;small id="surnameHelp" class="form-text text-muted"gt;Podaj nazwisko dawcylt;/smallgt; lt;/divgt; lt;div class="form-group"gt; lt;input type="email" class = "form-control" [(ngModel)]="donatorDTO.email" name="email" placeholder="np. jan.kowalski@wp.pl" gt; lt;small id="emailHelp" class="form-text text-muted"gt;Podaj email na którego dawca będzie otrzymywał wiadomości związane z HDKlt;/smallgt; lt;/divgt; lt;div class="form-group"gt; lt;select class="form-control" [(ngModel)]="donatorDTO.militaryRank" name="militaryRank"gt; lt;option *ngFor="let rank of ranks" [ngValue]="rank"gt;{{rank}}lt;/optiongt; lt;/selectgt; lt;small id="rankHelp" class="form-text text-muted"gt;Podaj stopień wojskowylt;/smallgt; lt;/divgt; lt;div class="form-group"gt; lt;select [(ngModel)]="donatorDTO.companyName" name="company" gt; lt;option *ngFor="let cmp of companies" [ngValue]="cmp"gt;{{cmp}}lt;/optiongt; lt;/selectgt; lt;small id="companyHelp" class="form-text text-muted"gt;Wybierz pododdział dawcylt;/smallgt; lt;/divgt; lt;div class="form-group"gt; lt;select [(ngModel)]="donatorDTO.bloodGroup" name="bloodGroup" gt; lt;option *ngFor="let blood of bloodGroups" [ngValue]="blood"gt;{{blood}}lt;/optiongt; lt;/selectgt; lt;/divgt; lt;div class="form-group"gt; lt;button class = "btn btn-success" type="submit"gt;Dodaj dawcę do bazylt;/buttongt; lt;/divgt; lt;/formgt; lt;/divgt; lt;/divgt; lt;/bodygt; lt;/htmlgt;
Here is model component:
export class DonatorDTO { name: string; surname: string; email: string; militaryRank: string; companyName: string; bloodGroup: string; }
And now springboot service code:
public void addDonator(DonatorDTO donatorDTO) throws MailException { if (donatorRepository.existsByEmail(donatorDTO.getEmail())) { throw new RuntimeException("User with this e-mail already exists in db"); } else { Donator donator = new Donator(); Company company = companyRepository.findByCompanyName(donatorDTO.getCompanyName()).orElseThrow(() -gt; new ResourceNotFoundException("Company not found")); BloodGroup blood = bloodGroupRepository.findBloodGroupByBloodType(donatorDTO.getBloodGroup()).orElseThrow(() -gt; new ResourceNotFoundException("Blood group not found")); donator.setName(firstLetterToUpperCase(donatorDTO.getName())); donator.setSurname(firstLetterToUpperCase(donatorDTO.getSurname())); donator.setEmail(donatorDTO.getEmail()); donator.setMilitaryRank(donatorDTO.getMilitaryRank()); donator.setCompany(company); donator.setBloodGroup(blood); blood.setNumberOfDonators(blood.getNumberOfDonators() 1); donator.setNextDonationDate(LocalDate.now()); donator.setIsCapable(true); donatorRepository.save(donator); try { mailService.helloNotification(donatorDTO); } catch (MailException mailException) { logger.error("Can't send email with confirmation of addition donator in a database"); logger.error(mailException.getMessage()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } } }
Controller code:
@RestController public class DonatorController { private final DonatorService donatorService; private final MailService mailService; public DonatorController(DonatorService donatorService, MailService mailService) { this.donatorService = donatorService; this.mailService = mailService; } @PostMapping(value = "/donators") public ResponseEntity addDonator(@RequestBody DonatorDTO donatorDTO) { donatorService.addDonator(donatorDTO); return new ResponseEntitylt;gt;(HttpStatus.OK); } }
А вот ДонаторДТО в спрингбут
package com.example.watkrew.dto; import com.example.watkrew.entity.BloodGroup; import com.example.watkrew.entity.Company; import com.example.watkrew.entity.Donator; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class DonatorDTO { private String name; private String surname; private String email; private String militaryRank; private String companyName; private String bloodGroup; public DonatorDTO(String name, String surname, String email, String militaryRank, Company company, BloodGroup bloodGroup) { this.name = name; this.surname = surname; this.email = email; this.militaryRank = militaryRank; this.companyName = company.getCompanyName(); this.bloodGroup = bloodGroup.getBloodType(); } }
Комментарии:
1. Можете ли вы отладить код на стороне сервера? Вы действительно бросаете
ResourceNotFoundException
, если компания или группа крови не могут быть найдены в базе данных. В качестве альтернативы убедитесь, что вашapplication.properties
файл долженserver.error.include-message=always
отправлять сообщение об исключении на стороне клиента, возможно, таким образом вы сможете увидеть, что на самом деле не так.2. К сожалению, после добавления вашего совета в application.properties нет дополнительного сообщения о том, что не так, и это все то же сообщение.