Próbuję usunąć stronę błędu białej etykiety, więc stworzyłem mapowanie kontrolera dla "/ error",
@RestController
public class IndexController {
@RequestMapping(value = "/error")
public String error() {
return "Error handling";
}
}
Ale teraz pojawia się ten błąd.
Exception in thread "AWT-EventQueue-0" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'basicErrorController' bean method
public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletR equest)
to {[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'indexController' bean method
Nie wiem, czy robię coś złego. Proszę o poradę.
EDYTOWAĆ:
Już dodane
error.whitelabel.enabled=false
do pliku application.properties, nadal pojawia się ten sam błąd
spring
spring-boot
Yasitha Waduge
źródło
źródło
spring.resources.add-mappings=false
?/error
wywołaniu ścieżki?Odpowiedzi:
Musisz zmienić kod na następujący:
Twój kod nie zadziałał, ponieważ Spring Boot automatycznie rejestruje
BasicErrorController
jako Spring Bean, gdy nie określono implementacjiErrorController
.Aby zobaczyć ten fakt, przejdź do
ErrorMvcAutoConfiguration.basicErrorController
tego miejsca .źródło
BasicErrorController
(patrz github.com/spring-projects/spring-boot/blob/ ... ), aby osiągnąć to, co chceszErrorAttributes
obiekt (zawierający szczegóły błędu), ale potem wypróbowałem po prostu @Autowiring i działa. Z czym na razie poszedłemJeśli chcesz mieć stronę odpowiedzi bardziej „JSONish”, możesz spróbować czegoś takiego:
źródło
Dokument rozruchowy sprężyny „był” nieprawidłowy (od tego czasu go naprawili):
Powinien być
źródło
/error
tak mapuje punkt końcowy . Aby zwolnić/error
zestaw punktów końcowychserver.error.path=/error-spring
lub inną ścieżkę alternatywną.Możesz go całkowicie usunąć, określając:
Należy jednak pamiętać, że zrobienie tego prawdopodobnie spowoduje wyświetlenie stron z białym etykietą kontenera serwletów :)
EDYCJA: Innym sposobem na zrobienie tego jest użycie pliku application.yaml. Po prostu wpisz wartość:
Dokumentacja
W przypadku Spring Boot <2.0 klasa znajduje się w pakiecie
org.springframework.boot.autoconfigure.web
.źródło
Instrukcja tutaj mówi, że trzeba ustawić
server.error.whitelabel.enabled
, abyfalse
wyłączyć standardową stronę błędu. Może tego chcesz?Nawiasem mówiąc, mam ten sam błąd po dodaniu / mapowaniu błędów.
źródło
/error
tak mapuje punkt końcowy . Aby zwolnić/error
zestaw punktów końcowychserver.error.path=/error-spring
lub inną ścieżkę alternatywną.Przy Spring Boot> 1.4.x możesz to zrobić:
ale wtedy w przypadku wyjątku kontener serwletu wyświetli własną stronę błędu.
źródło
Zależy to od wersji buta wiosennego:
Gdy SpringBootVersion <=,
1.2
użyjerror.whitelabel.enabled = false
Gdy SpringBootVersion > =,
1.3
użyjserver.error.whitelabel.enabled = false
źródło
W Spring Boot 1.4.1 przy użyciu szablonów Mustache wystarczy umieścić error.html w folderze szablonów:
Dodatkowe zmienne można przekazać, tworząc przechwytywacz dla
/error
źródło
Oto alternatywna metoda, która jest bardzo podobna do „starego sposobu” określania mapowań błędów w programie
web.xml
.Po prostu dodaj to do konfiguracji Spring Boot:
Następnie możesz normalnie zdefiniować strony błędów w treści statycznej.
W
@Component
razie potrzeby moduł dostosowywania może być również oddzielny .źródło
Używam Spring Boot w wersji 2.1.2 i
errorAttributes.getErrorAttributes()
podpis nie działa dla mnie (w odpowiedzi acohen). Chciałem odpowiedzi typu JSON, więc trochę poszperałem i stwierdziłem, że ta metoda zrobiła dokładnie to, czego potrzebowałem.Większość informacji uzyskałem z tego wątku, a także z tego wpisu na blogu .
Najpierw utworzyłem obiekt,
CustomErrorController
którego Spring będzie szukał, aby zmapować wszelkie błędy.Po drugie, utworzyłem
CustomHttpErrorResponse
klasę, która zwraca błąd jako JSON.Wreszcie musiałem wyłączyć Whitelabel w
application.properties
pliku.Powinno to działać nawet w przypadku
xml
próśb / odpowiedzi. Ale ja tego nie testowałem. Zrobił dokładnie to, czego szukałem, odkąd tworzyłem RESTful API i chciałem tylko zwrócić JSON.źródło
server.error.whitelabel.enabled = false
Dołącz powyższy wiersz do application.properties folderów zasobów
Więcej rozwiązywania problemów z błędami można znaleźć na http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page
źródło
Próbowałem wywołać punkt końcowy REST z mikrousługi i używałem metody put resttemplate .
W mojej konstrukcji, jeśli wystąpił jakiś błąd wewnątrz REST punktu końcowego powinien powrócić odpowiedź błędzie JSON, że pracuje dla niektórych połączeń, ale nie do tego umieścić jeden, to zwrócił white label stronę błędu zamiast.
Zrobiłem więc śledztwo i dowiedziałem się, że;
Sprężyna próbuje zrozumieć wywołującego, czy jest to maszyna, a następnie zwraca odpowiedź JSON, a jeśli jest to przeglądarka, zwraca kod HTML strony błędu białej etykiety .
W rezultacie: moja aplikacja kliencka musiała powiedzieć punktowi końcowemu REST, że wywołujący jest maszyną, a nie przeglądarką, więc w tym celu aplikacja klienta musiała dodać „ application / json ” do nagłówka ACCEPT wyraźnie dla metody „put” resttemplate. Dodałem to do nagłówka i rozwiązałem problem.
moje wywołanie punktu końcowego:
dla powyższego wywołania musiałem dodać poniżej parametr nagłówka.
czy też próbowałem zmienić put na wymianę, w tym przypadku połączenie wymiany dodało mi ten sam nagłówek i też rozwiązało problem, ale nie wiem dlaczego :)
źródło
Spring Boot domyślnie ma stronę błędu „ whiteabel ”, którą możesz zobaczyć w przeglądarce, jeśli napotkasz błąd serwera. Strona błędu Whitelabel to ogólna strona błędu Spring Boot, która jest wyświetlana, gdy nie zostanie znaleziona niestandardowa strona błędu.
Ustaw „server.error.whitelabel.enabled = false”, aby przełączyć domyślną stronę błędu
źródło
Miałem podobny problem z komunikatem o błędzie WhiteLabel na moim Angular SPA za każdym razem, gdy wykonałem odświeżenie.
Rozwiązaniem było utworzenie kontrolera, który implementuje ErrorController, ale zamiast zwracać String, musiałem zwrócić obiekt ModelAndView, który przekazuje do /
źródło