Explorar o código

Merge pull request #92 from JiaRG/master

去除一些重复的代码及增加了一些常见异常的处理
zhōuhào %!s(int64=6) %!d(string=hai) anos
pai
achega
a32edf8604

+ 1 - 1
README.md

@@ -1,5 +1,5 @@
 ## hsweb  3.0
-[![Maven metadata URI](https://img.shields.io/maven-metadata/v/http/nexus.hsweb.me/content/groups/public/org/hswebframework/web/hsweb-framework/maven-metadata.xml.svg)](http://nexus.hsweb.me/#nexus-search;quick~hsweb-framework)
+[![Maven Central](https://img.shields.io/maven-central/v/org.hswebframework.web/hsweb-framework.svg)](http://search.maven.org/#search%7Cga%7C1%7Corg.hswebframework)
 [![Codecov](https://codecov.io/gh/hs-web/hsweb-framework/branch/master/graph/badge.svg)](https://codecov.io/gh/hs-web/hsweb-framework/branch/master)
 [![Sonar Coverage](https://sonarcloud.io/api/project_badges/measure?project=org.hswebframework.web:hsweb-framework&metric=alert_status)](https://sonarcloud.io/dashboard?id=org.hswebframework.web%3Ahsweb-framework)
 [![Sonar Bugs](https://sonarcloud.io/api/project_badges/measure?project=org.hswebframework.web:hsweb-framework&metric=bugs)](https://sonarcloud.io/dashboard?id=org.hswebframework.web%3Ahsweb-framework)

+ 0 - 1
hsweb-boost/hsweb-boost-aop/src/main/java/org/hswebframework/web/boost/aop/context/MethodInterceptorHolder.java

@@ -80,7 +80,6 @@ public class MethodInterceptorHolder {
     }
 
     public MethodInterceptorHolder(String id, Method method, Object target, Map<String, Object> args) {
-        Objects.requireNonNull(id);
         Objects.requireNonNull(id);
         Objects.requireNonNull(method);
         Objects.requireNonNull(target);

+ 18 - 19
hsweb-datasource/hsweb-datasource-jta/README.md

@@ -24,26 +24,25 @@ spring:
 动态数据源配置,默认提供一个 ``InMemoryAtomikosDataSourceRepository``,在application.yml 中进行配置即可:
 ```yaml
 hsweb:
-  dynamic:
-    datasource:
-        test_ds:  # 数据源ID
-            xa-data-source-class-name: com.alibaba.druid.pool.xa.DruidXADataSource
-            xa-properties: # 数据源的配置属性
-              url: jdbc:h2:mem:test;DB_CLOSE_ON_EXIT=FALSE
-              username: sa
-              password:
-            max-pool-size: 20
-            borrow-connection-timeout: 1000
-        test_ds2: # 数据源ID
-          xa-data-source-class-name: com.alibaba.druid.pool.xa.DruidXADataSource
-          xa-properties: # 数据源的配置属性
-            url: jdbc:mysql://localhost:3306/hsweb?pinGlobalTxToPhysicalConnection=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
+  datasource:
+    test_ds:  # 数据源ID
+        xa-data-source-class-name: com.alibaba.druid.pool.xa.DruidXADataSource
+        xa-properties: # 数据源的配置属性
+          url: jdbc:h2:mem:test;DB_CLOSE_ON_EXIT=FALSE
+          username: sa
+          password:
+        max-pool-size: 20
+        borrow-connection-timeout: 1000
+    test_ds2: # 数据源ID
+      xa-data-source-class-name: com.alibaba.druid.pool.xa.DruidXADataSource
+      xa-properties: # 数据源的配置属性
+        url: jdbc:mysql://localhost:3306/hsweb?pinGlobalTxToPhysicalConnection=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
 #            url: jdbc:h2:mem:test2;DB_CLOSE_ON_EXIT=FALSE
-            username: root
-            password: 123456
-          max-pool-size: 20
-          borrow-connection-timeout: 1000
-          init-timeout: 20
+        username: root
+        password: "123456" # 纯数字密码要加上双引号,不然启动会报Cannot initialize AtomikosDataSourceBean
+      max-pool-size: 20
+      borrow-connection-timeout: 1000
+      init-timeout: 20
 ```
 
 自定义,将数据源配置放到数据库中,实现 ``DynamicDataSourceConfigRepository<AtomikosDataSourceConfig>`` 接口并注入到spring容器即可

+ 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

@@ -71,7 +71,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");