?????????????μ?????????????????????????????÷???? REST API ???????????????????????????
???????????????????У???????????????? Spring MVC ??д?? REST API ?в?????Щ???????????
????Spring ??????
????Spring MVC ??????????????????????? MVC ?????????????Controller???????????????????????????HandlerExceptionResolver ?? @ExceptionHandler ???
????HandlerExceptionResolvers ???????????????????????????????????????????????????????????@ExceptionHandler ???????????????Щ??????????????????????????????
?????????????????????????????????????京?е??????????????洦?????????????????????????????????????????????????÷??????/??????????д????? HTTP ??????????????????????????(separation of concerns)??????
????????????? REST ??????????????????????????????????е???????μ??????????????????????????????HandlerExceptionResolver?????????? ???????????? REST ???? HandlerExceptionResolver ???????????κ? REST API ????á?
????RestExceptionHandler
???????????????е? HandlerExceptionResolver ???????????? Spring MVC ????????棬??????? REST ????????????????????????????????????????????????????????????? HandlerExceptionResolver ??????? RestExceptionHandler
?????????????????????????? Spring MVC REST ????????? Stormpath ?? Github) ??? spring-mvc-rest-exhandler ??????
????????? Spring MVC REST ??????????????RestExceptionHandler ????
??????????????? RestError ?????RestError ???????????????????????????? REST ??????????
????????????? RestError ?? HTTP ????????ú???? HTTP ???????
?????? RestError ??????? HTTP ????塣?????????£?????????? JSON ????壬???????????е??????????
????????????????漰 RestExceptionHandler ???????????????????????????????????? RestExceptionHandler ??????????????????????????????????
??????????
??????????? Github ??? spring-mvc-rest-exhandler ?????????????????? RestExceptionHandler ?????????????????á?
?????????????????????? Maven ????????
?????????????????У???
????$ mvn clean install
????????????? RestExceptionHandler ????? .jar ???????????????????? web ??????? .war ????????????????????????и?????
????$ cd example
????$ mvn jetty:run
???????????????????? Jetty web ???????????? 8080??
???????
???????????????????????????? REST ???
????http://localhost:8080/v1/users/jsmith
????http://localhost:8080/v1/users/djones
????????Щ????????????????????????????????????????????????????????????
????/v1/ ·???μ??????κ????????????? HTTP 404 Not Found ????????????????????????? Rest ????????С??????????????? URL??
????http://localhost:8080/v1/users/doesNotExist
??????????????????? REST ?????????????……
?????????????????????????????????????????????????????????????????????????????? JSON ??????????????????????????????
????MVC ??????
???????????????????????? —— UserController ?? DefaultController??
????UserController
????UserController ???????????????????? Spring MVC ?????????????????????????????????????????????????????????????????壨?????????? UnknownResourceException??
???????????? UnknownResourceException ???????? RestExceptionHandler ?????????????漰???????????? HTTP 404 (Not Found)????????????????
????DefaultController
????DefaultController ????????????????????????????á???? @RequestMapping?? ??????????? Spring ????????????????????????Spring???????????????????
????DefaultController ???????????κγ?????????????? UnknownResourceException????? REST ??????????????????????????????????????????????????????????????????????
????????????? MVC ?????????????????????????????????????????????RestExceptionHandler??ν???Щ????? HTTP ?????????????????ζ????????????
????RestExceptionHandler ?? Spring ????
??????????????????? RestExceptionHandler Spring bean ???壺
<bean id="restExceptionResolver" class="com.stormpath.spring.web.servlet.handler.RestExceptionHandler">
<property name="order" value="100"></property>
<property name="errorResolver">
<bean class="com.stormpath.spring.web.servlet.handler.DefaultRestErrorResolver">
<property name="localeResolver" ref="localeResolver"></property>
<property name="defaultMoreInfoUrl" value="mailto:support@mycompany.com"></property>
<property name="exceptionMappingDefinitions">
<map>
<!– 404 –>
<entry key="com.stormpath.blog.spring.mvc.rest.exhandler.UnknownResourceException" value="404?? _exmsg"></entry>
<!– 500 (catch all): –>
<entry key="Throwable" value="500?? error.internal"></entry>
</map>
</property>
</bean>
</property>
</bean>
???????????????????????????? RestExceptionHandler ?????????????????????????????????????????????order ?? errorResolver?????????????????????????????? HttpMessageConverter ????????????????????????????Χ????
????Order
????order ?????????????????????HandlerExceptionResolvers?????????? RestExceptionHandler ????????????á?
???????磬?????????????? AnnotationMethodHandlerExceptionResolver bean ?????? order 0?????????????????????????????????? @ExceptionHandler ???????? RestExceptionHandler ?????? order 100???????????????????????????????????? rest-spring.xml ??????????????????
??????????????????? errorResolver ?????????????????????????????漰????
????RestErrorResolver
????RestExceptionHandler ??????????? RestError ????????и? RestErrorResolver ?????RestErrorResolver ?????η????????? REST???????RestError ?????
??????????? Spring XML ????????У?RestErrorResolver ?????? DefaultRestErrorResolver??DefaultRestErrorResolver?????????????????????????????RestError?????
?????????????????
?????????????????????????г?????κ????????????????????
??????????RestError ???壬??????????????????????????????????????????ι??????RestError ?????
?????? DefaultRestErrorResolver ???????????????????????????????????????????????????????????RestError ?????
???????? Spring ???????????????????? DefaultRestErrorResolver ??????Щ????????????Щ??????????????? bean ???????и????