मैं एक आरईएसटी सेवा विकसित कर रहा हूं। यह JSON का उपयोग करता है और किसी समस्या के मामले में कुछ पूर्वनिर्धारित JSON ऑब्जेक्ट को वापस करना होगा। डिफ़ॉल्ट स्प्रिंग प्रतिक्रिया इस प्रकार है:वसंत एमवीसी (या वसंत बूट)। सुरक्षा संबंधी अपवादों के लिए कस्टम JSON प्रतिक्रिया 401 अनधिकृत या 403 निषिद्ध)
{
"timestamp": 1512578593776,
"status": 403,
"error": "Forbidden",
"message": "Access Denied",
"path": "/swagger-ui.html"
}
मैं एक दम से एक (एक स्टैकट्रेस और अतिरिक्त अपवाद संबंधित जानकारी के साथ) के साथ इस डिफ़ॉल्ट JSON बदलना चाहते हैं।
वसंत डिफ़ॉल्ट व्यवहार को ओवरराइट करने का एक आसान तरीका प्रदान करता है। एक कस्टम अपवाद हैंडलर के साथ @RestControllerAdvice
बीन को परिभाषित करना चाहिए। जैसा इस
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = {Exception.class})
public ResponseEntity<ExceptionResponse> unknownException(Exception ex) {
ExceptionResponse resp = new ExceptionResponse(ex, level); // my custom response object
return new ResponseEntity<ExceptionResponse>(resp, resp.getStatus());
}
@ExceptionHandler(value = {AuthenticationException.class})
public ResponseEntity<ExceptionResponse> authenticationException(AuthenticationExceptionex) {
// WON'T WORK
}
}
कस्टम ExceptionResponse
वस्तु तो एक विशेष संदेश कनवर्टर का उपयोग कर स्प्रिंग द्वारा JSON में परिवर्तित हो जाएगा।
समस्या है, InsufficientAuthenticationException
की तरह है कि सुरक्षा अपवाद एक विधि @ExceptionHandler
के रूप में एनोटेट द्वारा रोक नहीं किया जा सकता। वसंत एमवीसी प्रेषक सर्वलेट दर्ज किए जाने से पहले इस तरह के अपवाद होते हैं और सभी एमवीसी हैंडलर शुरू किए गए थे।
कस्टम फ़िल्टर का उपयोग करके इस अपवाद को रोकना और स्क्रैच से अपना JSON क्रमबद्धता बनाना संभव है। इस मामले में किसी को एक कोड मिलेगा जो वसंत एमवीसी बुनियादी ढांचे के बाकी हिस्सों से पूरी तरह से स्वतंत्र है। यह अच्छा नहीं है।
मुझे मिला समाधान मैं काम करता प्रतीत होता है, लेकिन यह पागल लग रहा है।
@Configuration
public class CustomSecurityConfiguration extends
WebSecurityConfigurerAdapter {
@Autowired
protected RequestMappingHandlerAdapter requestMappingHandlerAdapter;
@Autowired
protected GlobalExceptionHandler exceptionHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.fullyAuthenticated();
http.exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint());
}
public AuthenticationEntryPoint authenticationEntryPoint() {
return new AuthenticationEntryPoint() {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
try {
ResponseEntity<ExceptionResponse> objResponse = exceptionHandler.authenticationException(authException);
Method unknownException = exceptionHandler.getClass().getMethod("authenticationException", AuthenticationException.class);
HandlerMethod handlerMethod = new HandlerMethod(exceptionHandler, unknownException);
MethodParameter returnType = handlerMethod.getReturnValueType(objResponse);
ModelAndViewContainer mvc = new ModelAndViewContainer(); // not really used here.
List<HttpMessageConverter<?>> mconverters = requestMappingHandlerAdapter.getMessageConverters();
DispatcherServletWebRequest webRequest = new DispatcherServletWebRequest(request, response);
HttpEntityMethodProcessor processor = new HttpEntityMethodProcessor(mconverters);
processor.handleReturnValue(objResponse, returnType, mvc, webRequest);
} catch (IOException e) {
throw e;
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new ServletException(e);
}
}
};
}
वहाँ (वसंत के साथ, संदेश कन्वर्टर्स में निर्माण MIME प्रारूप बातचीत आदि) वसंत क्रमबद्धता पाइप का उपयोग करने के जो इस की तुलना में बेहतर लग रहा है कोई तरीका है?
यहां कुछ और अधिक सुरुचिपूर्ण समाधान है, जो आपके जैसे ही हैं, लेकिन मूल अपवाद को अपवाद में लपेटना है जो @ExceptionHandler द्वारा "कैच" करने की अनुमति देता है: https://stackoverflow.com/questions/43632565/exceptionhandler-for- एक प्री-कंट्रोलर-फ़िल्टर-वसंत-सुरक्षा/43636386 – spekdrum
http://www.baeldung.com/spring-security-custom-access-denied-page –