Ecco il codice della classe:
package eb.contact;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.validation.Valid;
@Controller
@RequestMapping("/contacts")
class ContactController {
private ContactService contactService;
public ContactController(ContactService contactService) {
this.contactService = contactService;
}
@GetMapping("/new")
ModelAndView contactForm() {
return new ModelAndView("contact-form")
.addObject(new ContactForm());
}
@PostMapping("/new")
ModelAndView handleNewContactSubmission(
@Valid @ModelAttribute ContactForm contactForm,
BindingResult bindingResult,
RedirectAttributes attributes
) {
if (bindingResult.hasErrors()) {
return new ModelAndView("contact-form");
}
Contact contact = contactService.saveContact(contactForm);
return new ModelAndView("redirect:/contacts?id=" + contact.getId());
}
@GetMapping
ModelAndView contactDetails(@RequestParam("id") long contactId) {
return contactService.getContact(contactId)
.map(c -> new ModelAndView("contact-details")
.addObject("contact", c))
.orElse(new ModelAndView("redirect:/", HttpStatus.NOT_FOUND));
}
}
Se serve il link al progetto da cui ho estrapolato tutto quanto posso mandarvelo.
Il metodo che non capisco cosa faccia è questo:
@GetMapping
ModelAndView contactDetails(@RequestParam("id") long contactId) {
return contactService.getContact(contactId)
.map(c -> new ModelAndView("contact-details")
.addObject("contact", c))
.orElse(new ModelAndView("redirect:/", HttpStatus.NOT_FOUND));
}
}
L'unica cosa che ho capito è che contactDetails è un nuovo handler (gestore), ovvero un metodo che ha la funzione di visualizzare i dettagli di un account precedentemente creato in "contact-form.html" dentro una nuova pagina "contact-details.html" di riepilogo. Se il record non è stato scritto o l'ID cercato non esiste il metodo riporta l'utente alla pagina "/". La parte poco chiara è "HttpStatus.NOT_FOUND". Sia che aggiunga questa parte oppure no al ModelAndView non noto cambiamenti.
A questa pagina:
https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/ModelAndView.html
c'è scritto che HttpStatus.NOT_FOUND imposta lo stato a 404.
Ho provato a scrivere:
http://localhost:8080/contacts?id=13
(l'ID 135 non esiste)
e l'applicazione non mi scrive:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sun Apr 26 23:08:58 CEST 2020
There was an unexpected error (type=Not Found, status=404).
No message available
Quindi che differenza c'è tra:
.orElse(new ModelAndView("redirect:/", HttpStatus.NOT_FOUND));
e
.orElse(new ModelAndView("redirect:/"));
?