Commit cf654e61 by 罗长华

1、GeneralMessageHandler 增加异常处理逻辑

2、WsResponse增加多个静态创建方法
parent db13e47a
...@@ -6,14 +6,28 @@ import com.wecloud.dispatch.extend.ArgumentBox; ...@@ -6,14 +6,28 @@ import com.wecloud.dispatch.extend.ArgumentBox;
import com.wecloud.dispatch.extend.impl.DefaultArgumentBox; import com.wecloud.dispatch.extend.impl.DefaultArgumentBox;
import com.wecloud.dispatch.general.config.GeneralActionDispatcher; import com.wecloud.dispatch.general.config.GeneralActionDispatcher;
import com.wecloud.dispatch.general.extend.ActionMessageResolver; import com.wecloud.dispatch.general.extend.ActionMessageResolver;
import com.wecloud.im.exception.VerificationCodeException;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender; import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.utils.JsonUtils; import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException; import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.exception.DaoException;
import io.geekidea.springbootplus.framework.common.exception.SpringBootPlusException;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.ModelAndView;
/** /**
...@@ -23,36 +37,70 @@ import org.springframework.stereotype.Component; ...@@ -23,36 +37,70 @@ import org.springframework.stereotype.Component;
@Slf4j @Slf4j
public class GeneralMessageHandler { public class GeneralMessageHandler {
@Autowired @Autowired
private GeneralActionDispatcher generalActionDispatcher; private GeneralActionDispatcher generalActionDispatcher;
@Autowired @Autowired
private ActionMessageResolver actionMessageResolver; private ActionMessageResolver actionMessageResolver;
@Autowired @Autowired
private ChannelSender channelSender; private ChannelSender channelSender;
public void doMessage(Long senderClientId, ChannelHandlerContext ctx, String data) { public void doMessage(Long senderClientId, ChannelHandlerContext ctx, String data) {
if(log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("appWS收到data: {}\n senderClientId:{}, channelId:{}", data, senderClientId, ctx.channel().id().asLongText()); log.debug("appWS收到data: {}\n senderClientId:{}, channelId:{}", data, senderClientId, ctx.channel().id().asLongText());
} }
// 解析jsonO // 解析jsonO
BaseRequest baseRequest = JsonUtils.decodeJson(data, BaseRequest.class); BaseRequest baseRequest = JsonUtils.decodeJson(data, BaseRequest.class);
if (null == baseRequest || null == baseRequest.getAction()) { if (null == baseRequest || null == baseRequest.getAction()) {
throw new BusinessException("null == baseRequest || null == baseRequest.getAction()"); throw new BusinessException("null == baseRequest || null == baseRequest.getAction()");
} }
ActionMessage am = actionMessageResolver.resolver(generalActionDispatcher, baseRequest); ActionMessage am = actionMessageResolver.resolver(generalActionDispatcher, baseRequest);
am.setSenderChannel(ctx.channel()); am.setSenderChannel(ctx.channel());
am.setSenderClientId(senderClientId); am.setSenderClientId(senderClientId);
Object res = generalActionDispatcher.action(am);
if(res != null) { Exception actionException = null;
channelSender.sendMsgLocal((NioSocketChannel)am.getSenderChannel(), res); Object res = null;
} try {
} res = generalActionDispatcher.action(am);
} catch (Exception ex) {
public ArgumentBox getArgumentBox() { actionException = ex;
ArgumentBox beanBox = new DefaultArgumentBox(); }
return beanBox; processDispatchResult(am, res, actionException);
} }
public ArgumentBox getArgumentBox() {
ArgumentBox beanBox = new DefaultArgumentBox();
return beanBox;
}
private void processDispatchResult(ActionMessage am,
@Nullable Object res,
@Nullable Exception exception) {
if (exception != null) {
log.error("dispatch action error:", exception);
if (exception instanceof SpringBootPlusException) {
// 处理自定义异常
ApiCode errorCode;
if (exception instanceof BusinessException) {
errorCode = ApiCode.BUSINESS_EXCEPTION;
} else if (exception instanceof DaoException) {
errorCode = ApiCode.DAO_EXCEPTION;
} else if (exception instanceof VerificationCodeException) {
errorCode = ApiCode.VERIFICATION_CODE_EXCEPTION;
} else {
errorCode = ApiCode.SPRING_BOOT_PLUS_EXCEPTION;
}
res = WsResponse.result(errorCode, exception.getMessage(), false);
} else {
// 其他默认的全局异常处理
res = WsResponse.result(ApiCode.SYSTEM_EXCEPTION);
}
}
channelSender.sendMsgLocal((NioSocketChannel) am.getSenderChannel(), res);
}
} }
package com.wecloud.im.ws.model; package com.wecloud.im.ws.model;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.config.il8n.I18nMessageUtil;
import io.geekidea.springbootplus.framework.config.il8n.LanguageEnum;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import javax.xml.ws.Response;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
/** /**
* @Description websocket服务端响应消息和下方消息的封装对象 * @Description websocket服务端响应消息和下方消息的封装对象
* @Author hewei hwei1233@163.com * @Author hewei hwei1233@163.com
...@@ -41,4 +50,50 @@ public class WsResponse<T> implements Serializable { ...@@ -41,4 +50,50 @@ public class WsResponse<T> implements Serializable {
*/ */
private String reqId; private String reqId;
public static WsResponse<Boolean> result(ApiCode apiCode) {
return result(apiCode, true);
}
public static <T> WsResponse<T> result(ApiCode apiCode, T data) {
return result(apiCode, "", data);
}
public static <T> WsResponse<T> result(ApiCode apiCode, String message, T data) {
return result(WsResponseCmdEnum.RES.getCmdCode(), apiCode, message, data);
}
public static <T> WsResponse<T> result(Integer cmd, ApiCode apiCode, String message, T data) {
String success = "SUCCESS";
try {
message = I18nMessageUtil.getMessage(LanguageEnum.getLanguageType(null), apiCode.getMessage(), success);
} catch (IOException e) {
message = success;
}
WsResponse<T> response = new WsResponse<>();
response.setCmd(cmd).setCode(apiCode.getCode()).setMsg(message).setData(data);
return response;
}
public static WsResponse<Boolean> ok() {
return ok(true);
}
public static <T> WsResponse<T> ok(T data) {
return result(ApiCode.SUCCESS, data);
}
public static WsResponse<Boolean> fail() {
return fail("");
}
public static WsResponse<Boolean> fail(String message) {
return result(ApiCode.FAIL, message, false);
}
public static WsResponse<Boolean> fail(ApiCode apiCode, String message) {
return result(apiCode, message, false);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment