Mamy odpoczynku API, który używa Spring OAuth2
. Po uwierzytelnieniu użytkownika, wszystkie odpowiedzi JSON są w następującym formacie:Jak zawinąć wyjątek OAuth2?
{"code" : 12345, "data" : "..." }
Ale odpowiedź JSON dla niepowodzeń uwierzytelniania nie jest ono zgodne z powyższym formacie, jako że zajmuje się wiosną.
Na przykład w przypadku nieprawidłowych poświadczeń, klienci dostać kod stanu HTTP 400 z odpowiedzi JSON, co następuje:
{"error": "invalid_grant", "error_description": "Bad credentials" }
W przypadku, gdy konto użytkownika zostanie zablokowane, klienci otrzymują kod stanu HTTP 400 z JSON odpowiedź następująco
{"error":"invalid_grant","error_description":"User account is locked"}
Wszystko to dlatego, że wiosna TokenEndpoint.handleException() jest obsługa wyjątków związanych z/OAuth/żeton
Chciałbym zmienić odpowiedź JSON na niepowodzenia OAuth2, aby postępować zgodnie z pierwszym formatem.
To co próbowałem dotąd bez powodzenia:
- Korzystanie ControllerAdvice z najwyższego rzędu precendence & użytku @ExceptionHandler opisanym here
- wykonawczych OAuth2ExceptionRenderer jak opisano here
- wdrożyć ExceptionMapper
- dodano nowy ObjectMapper z rozszerzeniem StdSerializer. Chociaż mój obiektarz jest zainicjowany, nie jest używany do szeregowania wyjątków. Może dlatego, że Spring wywołuje bezpośrednio MappingJackson2HttpMessageConverter i wygląda na to, że w mojej aplikacji jest kilka wystąpień tej klasy.
Każda pomoc w dowolnym z powyższych podejść lub w nowym byłaby bardzo cenna.
Nie próbowałem podejścia this, ponieważ nie mogę zmienić ścieżki kontekstowej dla istniejących klientów.
jaki sposób mogę korzystać ExceptionMapper tłumaczyć wyjątek? –
@FerasOdeh ExceptionMapper jest funkcją JAX-WS, istnieje wiele przykładów tam w Internecie. Lepiej utworzyć nowe pytania w razie potrzeby – MangEngkus
@MangEngkus Jak mogę rozwiązać "approvalStore", ponieważ są to zmienne na poziomie klasy obiektu ApprovalStoreUserApprovalHandler i otrzymuję poniżej wyjątku, spowodowane przez: org.springframework.beans.factory.NoSuchBeanDefinitionException: Brak komponentu bean o nazwie "approvalStore" jest zdefiniowane jako – Soumyaansh