增加自定义code和message支持

This commit is contained in:
oyo
2025-12-14 16:08:56 +08:00
parent 9aeed3ca68
commit ecf745a1a5
11 changed files with 161 additions and 64 deletions

8
.idea/.gitignore generated vendored
View File

@@ -1,8 +0,0 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

10
.idea/misc.xml generated
View File

@@ -1,14 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ProjectRootManager" version="2" project-jdk-name="17" project-jdk-type="JavaSDK">
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/template/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_23" default="true" project-jdk-name="23" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>

9
.idea/modules.xml generated
View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/common-springboot-template-spring5-springboot2.iml" filepath="$PROJECT_DIR$/.idea/common-springboot-template-spring5-springboot2.iml" />
<module fileurl="file://$PROJECT_DIR$/template/template.iml" filepath="$PROJECT_DIR$/template/template.iml" />
</modules>
</component>
</project>

View File

@@ -0,0 +1,26 @@
package {{ .package }}.common.response;
public class FailData {
private int code = 500;
private String message;
public FailData() {
}
public int getCode() {
return this.code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
}

View File

@@ -1,9 +1,6 @@
package {{ .package }}.common.response; package {{ .package }}.common.response;
import com.vs.common.util.rpc.pub.FailData; import com.vs.ex.BizException;
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 lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
@@ -54,21 +51,16 @@ public class ResponseJsonExceptionResolver extends AbstractHandlerExceptionResol
@Override @Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
/**
* web请求分页单独处理应对antd框架
*/
FailData failData = new FailData(); FailData failData = new FailData();
failData.setMessage(ex.getMessage()); failData.setMessage(ex.getMessage());
if (ex instanceof IgnoredException) { if (ex instanceof BizException) {
IgnoredException realEx = (IgnoredException) ex; BizException realEx = (BizException) ex;
failData.setCode(realEx.getErrorCode()); failData.setCode(realEx.getCode());
failData.setData(realEx.getData()); failData.setMessage(realEx.getMessage());
log.error("execute {} failed with exception", request.getRequestURL(), ex); log.error("execute {} failed with exception", request.getRequestURL(), ex);
} else if (ex instanceof ConstraintViolationException) { } else if (ex instanceof ConstraintViolationException) {
failData.setCode(ErrorCode.WRONG_PARAMETER); failData.setCode(400);
failData.setMessage(getMessage((ConstraintViolationException) ex)); failData.setMessage(getMessage((ConstraintViolationException) ex));
} else if (ex instanceof ErrorCode) {
failData.setCode(((ErrorCode) ex).getErrorCode());
} else { } else {
log.error("execute {} failed with exception", request.getRequestURL(), ex); log.error("execute {} failed with exception", request.getRequestURL(), ex);
} }
@@ -101,7 +93,7 @@ public class ResponseJsonExceptionResolver extends AbstractHandlerExceptionResol
} }
param.append(node.getName()); param.append(node.getName());
} }
msgList.add("参数 [ " + param + " ] " + constraintViolation.getMessage()); msgList.add("Param [ " + param + " ] " + constraintViolation.getMessage());
} }
return StringUtils.join(msgList.toArray(), ";"); return StringUtils.join(msgList.toArray(), ";");
} }

View File

@@ -1,7 +1,5 @@
package {{ .package }}.common.response; package {{ .package }}.common.response;
import com.vs.common.util.rpc.pub.SuccessData;
import com.vs.ox.common.utils.ObjectMapperFactory;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@@ -15,9 +13,6 @@ import org.springframework.web.method.support.ModelAndViewContainer;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.Collections; import java.util.Collections;
/**
* 处理 Controller 里的返回值,从 Object转为Json
*/
public class ResponseJsonMethodReturnValueHandler implements HandlerMethodReturnValueHandler, InitializingBean { public class ResponseJsonMethodReturnValueHandler implements HandlerMethodReturnValueHandler, InitializingBean {
private HttpMessageConverter messageConverter; private HttpMessageConverter messageConverter;
@@ -35,14 +30,17 @@ public class ResponseJsonMethodReturnValueHandler implements HandlerMethodReturn
@Override @Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
mavContainer.setRequestHandled(true); try {
Object result = returnValue; mavContainer.setRequestHandled(true);
/** String customMessage = ResponseMessageHolder.getMessage();
* Web分页请求的返回按照antd框架要求的格式不转为SuccessData int code = ResponseMessageHolder.getCode();
*/ Object result = new SuccessData(code, returnValue, customMessage);
result = result == null ? new SuccessData(Collections.emptyMap()) : new SuccessData(returnValue);
ServletServerHttpResponse response = new ServletServerHttpResponse(webRequest.getNativeResponse(HttpServletResponse.class)); ServletServerHttpResponse response = new ServletServerHttpResponse(webRequest.getNativeResponse(HttpServletResponse.class));
messageConverter.write(result, new MediaType(MediaType.APPLICATION_JSON, Collections.singletonMap("charset", "utf-8")), response); messageConverter.write(result, new MediaType(MediaType.APPLICATION_JSON, Collections.singletonMap("charset", "utf-8")), response);
} finally {
ResponseMessageHolder.clear();
}
} }

View File

@@ -0,0 +1,44 @@
package {{ .package }}.common.response;
import java.lang.ThreadLocal;
public class ResponseMessageHolder {
private static final ThreadLocal<String> MESSAGE_HOLDER = new InheritableThreadLocal<>();
public static void setMessage(String message) {
MESSAGE_HOLDER.set(message);
}
public static String getMessage() {
return MESSAGE_HOLDER.get();
}
public static void clear() {
MESSAGE_HOLDER.remove();
}
private static final ThreadLocal<Integer> CODE_HOLDER = new InheritableThreadLocal<>();
public static void setCode(Integer code) {
CODE_HOLDER.set(code);
}
public static Integer getCode() {
Integer code = CODE_HOLDER.get();
return code == null ? 200 : code;
}
public static void clearCode() {
CODE_HOLDER.remove();
}
public static void setCodeAndMessage(Integer code, String message) {
setCode(code);
setMessage(message);
}
public static void clearAll() {
MESSAGE_HOLDER.remove();
CODE_HOLDER.remove();
}
}

View File

@@ -0,0 +1,49 @@
package {{ .package }}.common.response;
public class SuccessData {
private int code = 200;
private Object data;
private String message;
public SuccessData() {
}
public SuccessData(Object data){
this.data = data;
}
public SuccessData(int code, Object data) {
this.code = code;
this.data = data;
}
public SuccessData(int code, Object data, String message) {
this.code = code;
this.data = data;
this.message = message;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

View File

@@ -7,7 +7,6 @@ import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.MissingNode; import com.fasterxml.jackson.databind.node.MissingNode;
import com.vs.ox.common.utils.ObjectMapperFactory;
import java.io.IOException; import java.io.IOException;
import java.util.Optional; import java.util.Optional;

View File

@@ -0,0 +1,23 @@
package {{ .package }}.common.utils;
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;
public class ObjectMapperFactory {
private static final ObjectMapper objectMapper = new ObjectMapper();
public ObjectMapperFactory() {
}
public static ObjectMapper getDefaultObjectMapper() {
return objectMapper.copy();
}
static {
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES).disable(SerializationFeature.FAIL_ON_EMPTY_BEANS).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).configure(Feature.ALLOW_SINGLE_QUOTES, true);
objectMapper.setDateFormat(new MyDateFormat());
}
}