diff --git a/template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonExceptionResolver.java b/template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonExceptionResolver.java index ce114ad..e3a1beb 100644 --- a/template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonExceptionResolver.java +++ b/template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonExceptionResolver.java @@ -1,44 +1,44 @@ +package {{ .package }}.common.response; -package com.maquan_ceshi.maquan_ceshi.common.response; - -import com.vs.common.util.rpc.pub.FailData; import com.vs.ox.common.exception.ErrorCode; import com.vs.ox.common.exception.IgnoredException; import com.vs.ox.common.utils.ObjectMapperFactory; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.Ordered; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.server.ServletServerHttpResponse; +import org.springframework.util.ReflectionUtils; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Path; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.Path; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.http.MediaType; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.http.server.ServletServerHttpResponse; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver; +@Slf4j public class ResponseJsonExceptionResolver extends AbstractHandlerExceptionResolver implements InitializingBean { - private static final Logger log = LoggerFactory.getLogger(ResponseJsonExceptionResolver.class); private HttpMessageConverter messageConverter; public ResponseJsonExceptionResolver() { } + @Override public void afterPropertiesSet() throws Exception { - if (this.messageConverter == null) { - this.messageConverter = new MappingJackson2HttpMessageConverter(ObjectMapperFactory.getDefaultObjectMapper()); + if (messageConverter == null) { + messageConverter = new MappingJackson2HttpMessageConverter(ObjectMapperFactory.getDefaultObjectMapper()); } - } public static String getErrorInfoFromException(Exception e) { @@ -47,66 +47,63 @@ public class ResponseJsonExceptionResolver extends AbstractHandlerExceptionResol PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); return "\r\n" + sw.toString() + "\r\n"; - } catch (Exception var3) { + } catch (Exception e2) { return "bad getErrorInfoFromException"; } } + @Override protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + /** + * web请求分页单独处理,应对antd框架 + */ FailData failData = new FailData(); failData.setMessage(ex.getMessage()); if (ex instanceof IgnoredException) { - IgnoredException realEx = (IgnoredException)ex; + IgnoredException realEx = (IgnoredException) ex; failData.setCode(realEx.getErrorCode()); failData.setData(realEx.getData()); log.error("execute {} failed with exception", request.getRequestURL(), ex); } else if (ex instanceof ConstraintViolationException) { - failData.setCode(400); - failData.setMessage(getMessage((ConstraintViolationException)ex)); + failData.setCode(ErrorCode.WRONG_PARAMETER); + failData.setMessage(getMessage((ConstraintViolationException) ex)); } else if (ex instanceof ErrorCode) { - failData.setCode(((ErrorCode)ex).getErrorCode()); + failData.setCode(((ErrorCode) ex).getErrorCode()); } else { log.error("execute {} failed with exception", request.getRequestURL(), ex); } - try { response.setCharacterEncoding("utf-8"); - this.messageConverter.write(failData, MediaType.APPLICATION_JSON, new ServletServerHttpResponse(response)); - } catch (IOException var7) { - this.logger.error(var7.getMessage(), var7); + messageConverter.write(failData, MediaType.APPLICATION_JSON, new ServletServerHttpResponse(response)); + } catch (IOException e) { + logger.error(e.getMessage(), e); } - return new ModelAndView(); } + @Override public int getOrder() { - return Integer.MAX_VALUE; + return Ordered.LOWEST_PRECEDENCE; } public static String getMessage(ConstraintViolationException e) { - List msgList = new ArrayList(); - Iterator var2 = e.getConstraintViolations().iterator(); - - while(var2.hasNext()) { - ConstraintViolation constraintViolation = (ConstraintViolation)var2.next(); + List msgList = new ArrayList<>(); + for (ConstraintViolation constraintViolation : e.getConstraintViolations()) { int i = 0; StringBuilder param = new StringBuilder(); - - for(Iterator iterator = constraintViolation.getPropertyPath().iterator(); iterator.hasNext(); ++i) { - Path.Node node = (Path.Node)iterator.next(); - if (i != 0) { - if (!param.toString().isBlank()) { - param.append("."); - } - - param.append(node.getName()); + for (Iterator iterator = constraintViolation.getPropertyPath().iterator(); iterator.hasNext(); i++) { + Path.Node node = iterator.next(); + if (i == 0) { + continue; } + if (!param.toString().isBlank()) { + param.append("."); + } + param.append(node.getName()); } - - String var10001 = String.valueOf(param); - msgList.add("参数 [ " + var10001 + " ] " + constraintViolation.getMessage()); + msgList.add("参数 [ " + param + " ] " + constraintViolation.getMessage()); } - return StringUtils.join(msgList.toArray(), ";"); } -} \ No newline at end of file + +} diff --git a/template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonMethodReturnValueHandler.java b/template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonMethodReturnValueHandler.java index 9987864..a818ec2 100644 --- a/template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonMethodReturnValueHandler.java +++ b/template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonMethodReturnValueHandler.java @@ -1,9 +1,6 @@ -package com.maquan_ceshi.maquan_ceshi.common.response; +package {{ .package }}.common.response; -import com.vs.common.util.rpc.pub.PublicInterface; -import com.vs.common.util.rpc.pub.SuccessData; import com.vs.ox.common.utils.ObjectMapperFactory; -import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; @@ -15,39 +12,37 @@ import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.method.support.ModelAndViewContainer; import javax.servlet.http.HttpServletResponse; -import java.lang.reflect.Method; import java.util.Collections; /** - * 处理 Controller 里的返回值,从 Object 包装为 ResultDTO 类型 + * 处理 Controller 里的返回值,从 Object转为Json */ -@Slf4j public class ResponseJsonMethodReturnValueHandler implements HandlerMethodReturnValueHandler, InitializingBean { private HttpMessageConverter messageConverter; - public ResponseJsonMethodReturnValueHandler() { - } - + @Override public void afterPropertiesSet() { - if (this.messageConverter == null) { - this.messageConverter = new MappingJackson2HttpMessageConverter(ObjectMapperFactory.getDefaultObjectMapper()); + if (messageConverter == null) { + messageConverter = new MappingJackson2HttpMessageConverter(ObjectMapperFactory.getDefaultObjectMapper()); } - } + @Override public boolean supportsReturnType(MethodParameter returnType) { return true; } + @Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { - Method method = returnType.getMethod(); - //目前只处理自动生成接口 - PublicInterface annotation = method.getAnnotation(PublicInterface.class); - if (annotation != null) { - mavContainer.setRequestHandled(true); - Object result = returnValue == null ? new SuccessData(Collections.emptyMap()) : new SuccessData(returnValue); - ServletServerHttpResponse response = new ServletServerHttpResponse(webRequest.getNativeResponse(HttpServletResponse.class)); - this.messageConverter.write(result, new MediaType(MediaType.APPLICATION_JSON, Collections.singletonMap("charset", "utf-8")), response); - } + mavContainer.setRequestHandled(true); + Object result = returnValue; + /** + * Web分页请求的返回按照antd框架要求的格式,不转为SuccessData + */ + result = result == null ? new SuccessData(Collections.emptyMap()) : new SuccessData(returnValue); + ServletServerHttpResponse response = new ServletServerHttpResponse(webRequest.getNativeResponse(HttpServletResponse.class)); + messageConverter.write(result, new MediaType(MediaType.APPLICATION_JSON, Collections.singletonMap("charset", "utf-8")), response); } + + } diff --git a/template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonWebMvcConfiguration.java b/template/common/src/main/java/{{.packagePath}}/common/response/WebMvcConfiguration.java similarity index 54% rename from template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonWebMvcConfiguration.java rename to template/common/src/main/java/{{.packagePath}}/common/response/WebMvcConfiguration.java index 7c942db..05904e8 100644 --- a/template/common/src/main/java/{{.packagePath}}/common/response/ResponseJsonWebMvcConfiguration.java +++ b/template/common/src/main/java/{{.packagePath}}/common/response/WebMvcConfiguration.java @@ -1,28 +1,43 @@ -package com.maquan_ceshi.maquan_ceshi.common.response; +package {{ .package }}.common.response; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.vs.ox.starters.web.autoconfig.bind.JsonRequestParamHandlerMethodArgumentResolver; +import com.vs.ox.starters.web.autoconfig.bind.MyDateFormat; +import com.vs.ox.starters.web.autoconfig.interceptor.LoginCheckInterceptor; +import com.vs.ox.starters.web.autoconfig.interceptor.LoginTokenInterceptor; +import com.vs.ox.starters.web.autoconfig.resolver.ResponseJsonExceptionResolver; +import com.vs.ox.starters.web.autoconfig.resolver.ResponseJsonMethodReturnValueHandler; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.method.annotation.MapMethodProcessor; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.servlet.HandlerExceptionResolver; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.ViewNameMethodReturnValueHandler; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; +import java.text.DateFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @Configuration -public class ResponseJsonWebMvcConfiguration extends WebMvcConfigurerAdapter implements ApplicationContextAware, WebMvcConfigurer { - private RequestMappingHandlerAdapter requestMappingHandlerAdapter; - private ApplicationContext applicationContext; +@ComponentScan("{{ .package }}") +public class +WebMvcConfiguration extends WebMvcConfigurerAdapter implements ApplicationContextAware { + RequestMappingHandlerAdapter requestMappingHandlerAdapter; + ApplicationContext applicationContext; void init() { List returnValueHandlers = this.requestMappingHandlerAdapter.getReturnValueHandlers(); @@ -30,10 +45,11 @@ public class ResponseJsonWebMvcConfiguration extends WebMvcConfigurerAdapter imp List newProcessors = new ArrayList<>(); while (iterator.hasNext()) { HandlerMethodReturnValueHandler next = iterator.next(); - //在controller中直接返回map,不被默认的MapMethodProcessor拦截 + //为了能在controller中直接返回map,不被默认的MapMethodProcessor拦截 if (next instanceof MapMethodProcessor || - //在controller中直接返回String,不被默认的ViewNameMethodReturnValueHandler拦截 + //为了能在controller中直接返回String,不被默认的ViewNameMethodReturnValueHandler拦截 next instanceof ViewNameMethodReturnValueHandler) { + continue; } else { newProcessors.add(next); } @@ -41,12 +57,6 @@ public class ResponseJsonWebMvcConfiguration extends WebMvcConfigurerAdapter imp this.requestMappingHandlerAdapter.setReturnValueHandlers(newProcessors); } - @Override - public void addReturnValueHandlers(List returnValueHandlers) { - ResponseJsonMethodReturnValueHandler responseJsonMethodReturnValueHandler = new ResponseJsonMethodReturnValueHandler(); - responseJsonMethodReturnValueHandler.afterPropertiesSet(); - returnValueHandlers.add(responseJsonMethodReturnValueHandler); - } @Override public void extendHandlerExceptionResolvers(List exceptionResolvers) { @@ -59,12 +69,42 @@ public class ResponseJsonWebMvcConfiguration extends WebMvcConfigurerAdapter imp exceptionResolvers.add(responseJsonExceptionResolver); } + @Override + public void addReturnValueHandlers(List returnValueHandlers) { + ResponseJsonMethodReturnValueHandler responseJsonMethodReturnValueHandler = new ResponseJsonMethodReturnValueHandler(); + responseJsonMethodReturnValueHandler.afterPropertiesSet(); + returnValueHandlers.add(responseJsonMethodReturnValueHandler); + } + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new LoginTokenInterceptor()); + registry.addInterceptor(new LoginCheckInterceptor()); + } + + @Override + public void addArgumentResolvers(List argumentResolvers) { + argumentResolvers.add(new JsonRequestParamHandlerMethodArgumentResolver()); + super.addArgumentResolvers(argumentResolvers); + } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } + @Autowired + private Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder; + + @Bean + public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { + ObjectMapper mapper = jackson2ObjectMapperBuilder.build(); + DateFormat dateFormat = mapper.getDateFormat(); + mapper.setDateFormat(new MyDateFormat(dateFormat)); + MappingJackson2HttpMessageConverter mappingJsonpHttpMessageConverter = new MappingJackson2HttpMessageConverter(mapper); + return mappingJsonpHttpMessageConverter; + } @Bean ServletContextListener listener1() { @@ -73,10 +113,12 @@ public class ResponseJsonWebMvcConfiguration extends WebMvcConfigurerAdapter imp public void contextInitialized(ServletContextEvent sce) { requestMappingHandlerAdapter = applicationContext.getBean(RequestMappingHandlerAdapter.class); init(); + ServletContextListener.super.contextInitialized(sce); } @Override public void contextDestroyed(ServletContextEvent sce) { + ServletContextListener.super.contextDestroyed(sce); } }; }