1
1
/*
2
- * Copyright 2014 Jakub Jirutka <[email protected] >.
2
+ * Copyright 2014-2015 Jakub Jirutka <[email protected] >.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
19
19
import org .slf4j .Logger ;
20
20
import org .slf4j .LoggerFactory ;
21
21
import org .springframework .beans .factory .InitializingBean ;
22
+ import org .springframework .core .MethodParameter ;
22
23
import org .springframework .http .MediaType ;
23
24
import org .springframework .http .ResponseEntity ;
24
25
import org .springframework .http .converter .HttpMessageConverter ;
25
26
import org .springframework .util .Assert ;
27
+ import org .springframework .util .ClassUtils ;
26
28
import org .springframework .web .HttpMediaTypeNotAcceptableException ;
27
29
import org .springframework .web .accept .ContentNegotiationManager ;
28
30
import org .springframework .web .accept .FixedContentNegotiationStrategy ;
37
39
38
40
import javax .servlet .http .HttpServletRequest ;
39
41
import javax .servlet .http .HttpServletResponse ;
42
+ import java .lang .reflect .Method ;
40
43
import java .util .LinkedHashMap ;
41
44
import java .util .List ;
42
45
import java .util .Map ;
@@ -58,6 +61,8 @@ public class RestHandlerExceptionResolver extends AbstractHandlerExceptionResolv
58
61
59
62
private static final Logger LOG = LoggerFactory .getLogger (RestHandlerExceptionResolver .class );
60
63
64
+ private final MethodParameter returnTypeMethodParam ;
65
+
61
66
private List <HttpMessageConverter <?>> messageConverters = getDefaultHttpMessageConverters ();
62
67
63
68
private Map <Class <? extends Exception >, RestExceptionHandler > handlers = new LinkedHashMap <>();
@@ -81,6 +86,18 @@ public static RestHandlerExceptionResolverBuilder builder() {
81
86
}
82
87
83
88
89
+ public RestHandlerExceptionResolver () {
90
+
91
+ Method method = ClassUtils .getMethod (
92
+ RestExceptionHandler .class , "handleException" , Exception .class , HttpServletRequest .class );
93
+
94
+ returnTypeMethodParam = new MethodParameter (method , -1 );
95
+ // This method caches the resolved value, so it's convenient to initialize it
96
+ // only once here.
97
+ returnTypeMethodParam .getGenericParameterType ();
98
+ }
99
+
100
+
84
101
@ Override
85
102
public void afterPropertiesSet () {
86
103
if (contentNegotiationManager == null ) {
@@ -136,13 +153,16 @@ protected ResponseEntity<?> handleException(Exception exception, HttpServletRequ
136
153
137
154
protected void processResponse (ResponseEntity <?> entity , NativeWebRequest webRequest ) throws Exception {
138
155
156
+ // XXX: Create MethodParameter from the actually used subclass of RestExceptionHandler?
157
+ MethodParameter methodParameter = new MethodParameter (returnTypeMethodParam );
139
158
ModelAndViewContainer mavContainer = new ModelAndViewContainer ();
159
+
140
160
try {
141
- responseProcessor .handleReturnValue (entity , null , mavContainer , webRequest );
161
+ responseProcessor .handleReturnValue (entity , methodParameter , mavContainer , webRequest );
142
162
143
163
} catch (HttpMediaTypeNotAcceptableException ex ) {
144
164
LOG .debug ("Requested media type is not supported, falling back to default one" );
145
- fallbackResponseProcessor .handleReturnValue (entity , null , mavContainer , webRequest );
165
+ fallbackResponseProcessor .handleReturnValue (entity , methodParameter , mavContainer , webRequest );
146
166
}
147
167
}
148
168
0 commit comments