HttpStatus.NOT_FOUND in ModelAndView

di il
2 risposte

HttpStatus.NOT_FOUND in ModelAndView

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:/"));
?

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte