Jelajahi Sumber

1、去除@ResponseBody注解,因为@RestControllerAdvice注解中已经包含;
2、新增一些常见异常的的处理;
3、用户登录异常信息提示友好。之前输错了用户名,还是提示密码错误。

Jia_RG 6 tahun lalu
induk
melakukan
14f8e9241b

+ 58 - 13
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/RestControllerExceptionTranslator.java

@@ -30,12 +30,16 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.FieldError;
+import org.springframework.web.HttpMediaTypeNotSupportedException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.NoHandlerFoundException;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.sql.SQLException;
 import java.util.List;
@@ -47,7 +51,6 @@ public class RestControllerExceptionTranslator {
 
     @ExceptionHandler(JSONException.class)
     @ResponseStatus(HttpStatus.BAD_REQUEST)
-    @ResponseBody
     ResponseMessage handleException(JSONException exception) {
         logger.error("json error", exception);
         return ResponseMessage.error(400, exception.getMessage());
@@ -55,7 +58,6 @@ public class RestControllerExceptionTranslator {
 
     @ExceptionHandler(org.hswebframework.ezorm.rdb.exception.ValidationException.class)
     @ResponseStatus(HttpStatus.BAD_REQUEST)
-    @ResponseBody
     ResponseMessage<Object> handleException(org.hswebframework.ezorm.rdb.exception.ValidationException exception) {
         return ResponseMessage.error(400, exception.getMessage())
                 .result(exception.getValidateResult());
@@ -63,14 +65,12 @@ public class RestControllerExceptionTranslator {
 
     @ExceptionHandler(ValidationException.class)
     @ResponseStatus(HttpStatus.BAD_REQUEST)
-    @ResponseBody
     ResponseMessage<List<ValidateResults.Result>> handleException(ValidationException exception) {
         return ResponseMessage.<List<ValidateResults.Result>>error(400, exception.getMessage())
                 .result(exception.getResults());
     }
 
     @ExceptionHandler(BusinessException.class)
-    @ResponseBody
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     ResponseMessage handleException(BusinessException exception) {
         if (exception.getCause() != null) {
@@ -81,28 +81,24 @@ public class RestControllerExceptionTranslator {
 
     @ExceptionHandler(UnAuthorizedException.class)
     @ResponseStatus(HttpStatus.UNAUTHORIZED)
-    @ResponseBody
     ResponseMessage handleException(UnAuthorizedException exception) {
         return ResponseMessage.error(401, exception.getMessage()).result(exception.getState());
     }
 
     @ExceptionHandler(AccessDenyException.class)
     @ResponseStatus(HttpStatus.FORBIDDEN)
-    @ResponseBody
     ResponseMessage handleException(AccessDenyException exception) {
         return ResponseMessage.error(403, exception.getMessage());
     }
 
     @ExceptionHandler(NotFoundException.class)
     @ResponseStatus(HttpStatus.NOT_FOUND)
-    @ResponseBody
     ResponseMessage handleException(NotFoundException exception) {
         return ResponseMessage.error(404, exception.getMessage());
     }
 
     @ExceptionHandler(MethodArgumentNotValidException.class)
     @ResponseStatus(HttpStatus.BAD_REQUEST)
-    @ResponseBody
     ResponseMessage handleException(MethodArgumentNotValidException e) {
         SimpleValidateResults results = new SimpleValidateResults();
         e.getBindingResult().getAllErrors()
@@ -116,7 +112,6 @@ public class RestControllerExceptionTranslator {
 
     @ExceptionHandler(RuntimeException.class)
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
-    @ResponseBody
     ResponseMessage handleException(RuntimeException exception) {
         logger.error(exception.getMessage(), exception);
         return ResponseMessage.error(500, exception.getMessage());
@@ -124,7 +119,6 @@ public class RestControllerExceptionTranslator {
 
     @ExceptionHandler(NullPointerException.class)
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
-    @ResponseBody
     ResponseMessage handleException(NullPointerException exception) {
         logger.error(exception.getMessage(), exception);
         return ResponseMessage.error(500, "服务器内部错误");
@@ -132,7 +126,6 @@ public class RestControllerExceptionTranslator {
 
     @ExceptionHandler(SQLException.class)
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
-    @ResponseBody
     ResponseMessage handleException(SQLException exception) {
         logger.error(exception.getMessage(), exception);
         return ResponseMessage.error(500, "服务器内部错误");
@@ -140,9 +133,61 @@ public class RestControllerExceptionTranslator {
 
     @ExceptionHandler(IllegalArgumentException.class)
     @ResponseStatus(HttpStatus.BAD_REQUEST)
-    @ResponseBody
     ResponseMessage handleException(IllegalArgumentException exception) {
         logger.error(exception.getMessage(), exception);
         return ResponseMessage.error(400, "参数错误:" + exception.getMessage());
     }
+
+    /**
+     * 请求方式不支持异常
+     * 比如:POST方式的API, GET方式请求
+     */
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
+    ResponseMessage handleException(HttpRequestMethodNotSupportedException exception) {
+        logger.error(exception.getMessage(), exception);
+        return ResponseMessage.error(HttpStatus.METHOD_NOT_ALLOWED.value(), "请求API的方式不支持").result(exception.getSupportedHttpMethods());
+    }
+
+    /**
+     * 404异常,Spring MVC DispatcherServlet 当没找到 Handler处理请求时,
+     * 如果配置了 throwExceptionIfNoHandlerFound 为 true时,会抛出此异常
+     *
+     * 在配置文件中使用:
+     *  spring:
+     *       mvc:
+     *         throw-exception-if-no-handler-found: true
+     *
+     * @see org.springframework.web.servlet.DispatcherServlet#noHandlerFound(HttpServletRequest, HttpServletResponse)
+     */
+    @ExceptionHandler(NoHandlerFoundException.class)
+    @ResponseStatus(HttpStatus.NOT_FOUND)
+    ResponseMessage handleException(NoHandlerFoundException exception) {
+        logger.error(exception.getMessage(), exception);
+        return ResponseMessage.error(HttpStatus.NOT_FOUND.value(), "请求URL不存在");
+    }
+
+    /**
+     * ContentType不支持异常
+     * 比如:@RequestBody注解,需要Content-Type: application/json, 但是请求未指定使用的默认的 Content-Type: application/x-www-form-urlencoded
+     */
+    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
+    @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
+    ResponseMessage handleException(HttpMediaTypeNotSupportedException exception) {
+        logger.error(exception.getMessage(), exception);
+        return ResponseMessage.error(HttpStatus.UNSUPPORTED_MEDIA_TYPE.value(), "请求URL不存在");
+    }
+
+    /**
+     * 请求方法的的参数缺失
+     */
+    @ExceptionHandler(MissingServletRequestParameterException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    ResponseMessage handleException(MissingServletRequestParameterException exception) {
+        logger.error(exception.getMessage(), exception);
+        return ResponseMessage.error(HttpStatus.BAD_REQUEST.value(), "请求缺失参数:" + exception.getMessage());
+    }
+
+
+
 }

+ 1 - 1
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-local/src/main/java/org/hswebframework/web/service/authorization/simple/SimpleAuthenticationManager.java

@@ -72,7 +72,7 @@ public class SimpleAuthenticationManager implements AuthenticationManager {
             String password = ((PlainTextUsernamePasswordAuthenticationRequest) request).getPassword();
             UserEntity userEntity = userService.selectByUserNameAndPassword(username, password);
             if (userEntity == null) {
-                throw new ValidationException("密码错误", "password");
+                throw new ValidationException("用户名或密码错误");
             }
             if (!DataStatus.STATUS_ENABLED.equals(userEntity.getStatus())) {
                 throw new ValidationException("用户已被禁用", "username");