项目结构重构,提升可维护性与易读性;

3.2.0-release
xuxueli 4 weeks ago
parent 6d316112a9
commit e02f2c65c0

@ -1,6 +1,6 @@
package com.xxl.job.admin.controller.biz;
import com.xxl.job.admin.web.interceptor.PermissionInterceptor;
import com.xxl.job.admin.web.xxlsso.PermissionInterceptor;
import com.xxl.job.admin.model.XxlJobInfo;
import com.xxl.job.admin.model.XxlJobLogGlue;
import com.xxl.job.admin.util.I18nUtil;

@ -1,6 +1,6 @@
package com.xxl.job.admin.controller.biz;
import com.xxl.job.admin.web.interceptor.PermissionInterceptor;
import com.xxl.job.admin.web.xxlsso.PermissionInterceptor;
import com.xxl.job.admin.scheduler.exception.XxlJobException;
import com.xxl.job.admin.model.XxlJobGroup;
import com.xxl.job.admin.model.XxlJobInfo;

@ -1,6 +1,6 @@
package com.xxl.job.admin.controller.biz;
import com.xxl.job.admin.web.interceptor.PermissionInterceptor;
import com.xxl.job.admin.web.xxlsso.PermissionInterceptor;
import com.xxl.job.admin.scheduler.complete.XxlJobCompleter;
import com.xxl.job.admin.scheduler.exception.XxlJobException;
import com.xxl.job.admin.model.XxlJobGroup;

@ -6,7 +6,7 @@ import com.xxl.job.admin.mapper.XxlJobUserMapper;
import com.xxl.job.admin.model.XxlJobGroup;
import com.xxl.job.admin.model.XxlJobUser;
import com.xxl.job.admin.util.I18nUtil;
import com.xxl.job.admin.web.interceptor.PermissionInterceptor;
import com.xxl.job.admin.web.xxlsso.PermissionInterceptor;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.tool.encrypt.SHA256Tool;
import jakarta.annotation.Resource;

@ -4,8 +4,8 @@ import com.xxl.job.admin.mapper.XxlJobUserMapper;
import com.xxl.job.admin.model.XxlJobUser;
import com.xxl.job.admin.util.CookieUtil;
import com.xxl.job.admin.util.I18nUtil;
import com.xxl.job.admin.util.JacksonUtil;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.util.GsonTool;
import com.xxl.tool.encrypt.SHA256Tool;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
@ -29,7 +29,7 @@ public class LoginService {
// ---------------------- token tool ----------------------
private String makeToken(XxlJobUser xxlJobUser){
String tokenJson = JacksonUtil.writeValueAsString(xxlJobUser);
String tokenJson = GsonTool.toJson(xxlJobUser);
String tokenHex = new BigInteger(tokenJson.getBytes()).toString(16);
return tokenHex;
}
@ -37,7 +37,7 @@ public class LoginService {
XxlJobUser xxlJobUser = null;
if (tokenHex != null) {
String tokenJson = new String(new BigInteger(tokenHex, 16).toByteArray()); // username_password(md5)
xxlJobUser = JacksonUtil.readValue(tokenJson, XxlJobUser.class);
xxlJobUser = GsonTool.fromJson(tokenJson, XxlJobUser.class);
}
return xxlJobUser;
}

@ -1,31 +0,0 @@
package com.xxl.job.admin.util;
import freemarker.ext.beans.BeansWrapper;
import freemarker.ext.beans.BeansWrapperBuilder;
import freemarker.template.Configuration;
import freemarker.template.TemplateHashModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ftl util
*
* @author xuxueli 2018-01-17 20:37:48
*/
public class FtlUtil {
private static Logger logger = LoggerFactory.getLogger(FtlUtil.class);
private static BeansWrapper wrapper = new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS).build(); //BeansWrapper.getDefaultInstance();
public static TemplateHashModel generateStaticModel(String packageName) {
try {
TemplateHashModel staticModels = wrapper.getStaticModels();
TemplateHashModel fileStatics = (TemplateHashModel) staticModels.get(packageName);
return fileStatics;
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return null;
}
}

@ -1,6 +1,7 @@
package com.xxl.job.admin.util;
import com.xxl.job.admin.scheduler.conf.XxlJobAdminConfig;
import com.xxl.job.core.util.GsonTool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
@ -59,7 +60,7 @@ public class I18nUtil {
* @return
*/
public static String getMultString(String... keys) {
Map<String, String> map = new HashMap<String, String>();
Map<String, String> map = new HashMap<>();
Properties prop = loadI18nProp();
if (keys!=null && keys.length>0) {
@ -72,8 +73,7 @@ public class I18nUtil {
}
}
String json = JacksonUtil.writeValueAsString(map);
return json;
return GsonTool.toJson(map);
}
}

@ -1,92 +0,0 @@
package com.xxl.job.admin.util;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
/**
* Jackson util
*
* 1obj need private and set/get
* 2do not support inner class
*
* @author xuxueli 2015-9-25 18:02:56
*/
public class JacksonUtil {
private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class);
private final static ObjectMapper objectMapper = new ObjectMapper();
public static ObjectMapper getInstance() {
return objectMapper;
}
/**
* beanarrayListMap --> json
*
* @param obj
* @return json string
* @throws Exception
*/
public static String writeValueAsString(Object obj) {
try {
return getInstance().writeValueAsString(obj);
} catch (JsonGenerationException e) {
logger.error(e.getMessage(), e);
} catch (JsonMappingException e) {
logger.error(e.getMessage(), e);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return null;
}
/**
* string --> beanMapList(array)
*
* @param jsonStr
* @param clazz
* @return obj
* @throws Exception
*/
public static <T> T readValue(String jsonStr, Class<T> clazz) {
try {
return getInstance().readValue(jsonStr, clazz);
} catch (JsonParseException e) {
logger.error(e.getMessage(), e);
} catch (JsonMappingException e) {
logger.error(e.getMessage(), e);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return null;
}
/**
* string --> List<Bean>...
*
* @param jsonStr
* @param parametrized
* @param parameterClasses
* @param <T>
* @return
*/
public static <T> T readValue(String jsonStr, Class<?> parametrized, Class<?>... parameterClasses) {
try {
JavaType javaType = getInstance().getTypeFactory().constructParametricType(parametrized, parameterClasses);
return getInstance().readValue(jsonStr, javaType);
} catch (JsonParseException e) {
logger.error(e.getMessage(), e);
} catch (JsonMappingException e) {
logger.error(e.getMessage(), e);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return null;
}
}

@ -0,0 +1,31 @@
//package com.xxl.job.admin.util;
//
//import freemarker.ext.beans.BeansWrapper;
//import freemarker.ext.beans.BeansWrapperBuilder;
//import freemarker.template.Configuration;
//import freemarker.template.TemplateHashModel;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
///**
// * ftl util
// *
// * @author xuxueli 2018-01-17 20:37:48
// */
//public class FtlUtil {
// private static Logger logger = LoggerFactory.getLogger(FtlUtil.class);
//
// private static BeansWrapper wrapper = new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS).build(); //BeansWrapper.getDefaultInstance();
//
// public static TemplateHashModel generateStaticModel(String packageName) {
// try {
// TemplateHashModel staticModels = wrapper.getStaticModels();
// TemplateHashModel fileStatics = (TemplateHashModel) staticModels.get(packageName);
// return fileStatics;
// } catch (Exception e) {
// logger.error(e.getMessage(), e);
// }
// return null;
// }
//
//}

@ -0,0 +1,92 @@
//package com.xxl.job.admin.util;
//
//import com.fasterxml.jackson.core.JsonGenerationException;
//import com.fasterxml.jackson.core.JsonParseException;
//import com.fasterxml.jackson.databind.JavaType;
//import com.fasterxml.jackson.databind.JsonMappingException;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.io.IOException;
//
///**
// * Jackson util
// *
// * 1、obj need private and set/get
// * 2、do not support inner class
// *
// * @author xuxueli 2015-9-25 18:02:56
// */
//public class JacksonUtil {
// private static Logger logger = LoggerFactory.getLogger(JacksonUtil.class);
//
// private final static ObjectMapper objectMapper = new ObjectMapper();
// public static ObjectMapper getInstance() {
// return objectMapper;
// }
//
// /**
// * bean、array、List、Map --> json
// *
// * @param obj
// * @return json string
// * @throws Exception
// */
// public static String writeValueAsString(Object obj) {
// try {
// return getInstance().writeValueAsString(obj);
// } catch (JsonGenerationException e) {
// logger.error(e.getMessage(), e);
// } catch (JsonMappingException e) {
// logger.error(e.getMessage(), e);
// } catch (IOException e) {
// logger.error(e.getMessage(), e);
// }
// return null;
// }
//
// /**
// * string --> bean、Map、List(array)
// *
// * @param jsonStr
// * @param clazz
// * @return obj
// * @throws Exception
// */
// public static <T> T readValue(String jsonStr, Class<T> clazz) {
// try {
// return getInstance().readValue(jsonStr, clazz);
// } catch (JsonParseException e) {
// logger.error(e.getMessage(), e);
// } catch (JsonMappingException e) {
// logger.error(e.getMessage(), e);
// } catch (IOException e) {
// logger.error(e.getMessage(), e);
// }
// return null;
// }
//
// /**
// * string --> List<Bean>...
// *
// * @param jsonStr
// * @param parametrized
// * @param parameterClasses
// * @param <T>
// * @return
// */
// public static <T> T readValue(String jsonStr, Class<?> parametrized, Class<?>... parameterClasses) {
// try {
// JavaType javaType = getInstance().getTypeFactory().constructParametricType(parametrized, parameterClasses);
// return getInstance().readValue(jsonStr, javaType);
// } catch (JsonParseException e) {
// logger.error(e.getMessage(), e);
// } catch (JsonMappingException e) {
// logger.error(e.getMessage(), e);
// } catch (IOException e) {
// logger.error(e.getMessage(), e);
// }
// return null;
// }
//}

@ -1,4 +1,4 @@
package com.xxl.job.admin.web.resolver;
package com.xxl.job.admin.web.error;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;

@ -1,8 +1,8 @@
package com.xxl.job.admin.web.resolver;
package com.xxl.job.admin.web.error;
import com.xxl.job.admin.scheduler.exception.XxlJobException;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.admin.util.JacksonUtil;
import com.xxl.tool.gson.GsonTool;
import com.xxl.tool.response.Response;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
@ -21,8 +21,8 @@ import java.io.IOException;
* @author xuxueli 2016-1-6 19:22:18
*/
@Component
public class WebExceptionResolver implements HandlerExceptionResolver {
private static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class);
public class WebHandlerExceptionResolver implements HandlerExceptionResolver {
private static transient Logger logger = LoggerFactory.getLogger(WebHandlerExceptionResolver.class);
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
@ -31,35 +31,35 @@ public class WebExceptionResolver implements HandlerExceptionResolver {
logger.error("WebExceptionResolver:{}", ex);
}
// if json
// parse isJson
boolean isJson = false;
if (handler instanceof HandlerMethod) {
HandlerMethod method = (HandlerMethod)handler;
ResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class);
if (responseBody != null) {
isJson = true;
}
isJson = method.getMethodAnnotation(ResponseBody.class)!=null;
}
// error result
ReturnT<String> errorResult = new ReturnT<String>(ReturnT.FAIL_CODE, ex.toString().replaceAll("\n", "<br/>"));
// response
// process error
ModelAndView mv = new ModelAndView();
if (isJson) {
try {
response.setContentType("application/json;charset=utf-8");
response.getWriter().print(JacksonUtil.writeValueAsString(errorResult));
// errorMsg
String errorMsg = GsonTool.toJson(Response.ofFail(ex.toString()));
// write response
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().println(errorMsg);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return mv;
} else {
mv.addObject("exceptionMsg", errorResult.getMsg());
mv.setViewName("/common/common.errorpage");
mv.addObject("exceptionMsg", ex.toString());
mv.setViewName("common/common.errorpage");
return mv;
}
}
}

@ -0,0 +1,51 @@
package com.xxl.job.admin.web.interceptor;
import com.xxl.job.admin.util.I18nUtil;
import com.xxl.tool.freemarker.FtlTool;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.HashMap;
/**
* push cookies to model as cookieMap
*
* @author xuxueli 2015-12-12 18:09:04
*/
@Component
public class CommonDataInterceptor implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AsyncHandlerInterceptor() {
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
// cookie
if (modelAndView!=null && request.getCookies()!=null && request.getCookies().length>0) {
HashMap<String, Cookie> cookieMap = new HashMap<String, Cookie>();
for (Cookie ck : request.getCookies()) {
cookieMap.put(ck.getName(), ck);
}
modelAndView.addObject("cookieMap", cookieMap);
}
// static method
if (modelAndView != null) {
modelAndView.addObject("I18nUtil", FtlTool.generateStaticModel(I18nUtil.class.getName()));
}
}
}).addPathPatterns("/**");
}
}

@ -1,42 +0,0 @@
package com.xxl.job.admin.web.interceptor;
import com.xxl.job.admin.util.FtlUtil;
import com.xxl.job.admin.util.I18nUtil;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
/**
* push cookies to model as cookieMap
*
* @author xuxueli 2015-12-12 18:09:04
*/
@Component
public class CookieInterceptor implements AsyncHandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// cookie
if (modelAndView!=null && request.getCookies()!=null && request.getCookies().length>0) {
HashMap<String, Cookie> cookieMap = new HashMap<String, Cookie>();
for (Cookie ck : request.getCookies()) {
cookieMap.put(ck.getName(), ck);
}
modelAndView.addObject("cookieMap", cookieMap);
}
// static method
if (modelAndView != null) {
modelAndView.addObject("I18nUtil", FtlUtil.generateStaticModel(I18nUtil.class.getName()));
}
}
}

@ -1,4 +1,4 @@
package com.xxl.job.admin.web.interceptor;
package com.xxl.job.admin.web.xxlsso;
import com.xxl.job.admin.annotation.PermissionLimit;
import com.xxl.job.admin.model.XxlJobGroup;

@ -1,5 +1,6 @@
package com.xxl.job.admin.web.interceptor;
package com.xxl.job.admin.web.xxlsso;
import com.xxl.job.admin.web.interceptor.CommonDataInterceptor;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@ -15,13 +16,10 @@ public class WebMvcConfig implements WebMvcConfigurer {
@Resource
private PermissionInterceptor permissionInterceptor;
@Resource
private CookieInterceptor cookieInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
registry.addInterceptor(cookieInterceptor).addPathPatterns("/**");
}
}

@ -1,41 +1,41 @@
package com.xxl.job.admin.core.util;
import com.xxl.job.admin.util.JacksonUtil;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
import static com.xxl.job.admin.util.JacksonUtil.writeValueAsString;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class JacksonUtilTest {
@Test
public void shouldWriteValueAsString() {
//given
Map<String, String> map = new HashMap<>();
map.put("aaa", "111");
map.put("bbb", "222");
//when
String json = writeValueAsString(map);
//then
assertEquals(json, "{\"aaa\":\"111\",\"bbb\":\"222\"}");
}
@Test
public void shouldReadValueAsObject() {
//given
String jsonString = "{\"aaa\":\"111\",\"bbb\":\"222\"}";
//when
Map result = JacksonUtil.readValue(jsonString, Map.class);
//then
assertEquals(result.get("aaa"), "111");
assertEquals(result.get("bbb"),"222");
}
}
//package com.xxl.job.admin.core.util;
//
//import com.xxl.job.admin.util.JacksonUtil;
//import org.junit.jupiter.api.Test;
//
//import java.util.HashMap;
//import java.util.Map;
//
//import static com.xxl.job.admin.util.JacksonUtil.writeValueAsString;
//import static org.junit.jupiter.api.Assertions.assertEquals;
//
//public class JacksonUtilTest {
//
// @Test
// public void shouldWriteValueAsString() {
// //given
// Map<String, String> map = new HashMap<>();
// map.put("aaa", "111");
// map.put("bbb", "222");
//
// //when
// String json = writeValueAsString(map);
//
// //then
// assertEquals(json, "{\"aaa\":\"111\",\"bbb\":\"222\"}");
// }
//
// @Test
// public void shouldReadValueAsObject() {
// //given
// String jsonString = "{\"aaa\":\"111\",\"bbb\":\"222\"}";
//
// //when
// Map result = JacksonUtil.readValue(jsonString, Map.class);
//
// //then
// assertEquals(result.get("aaa"), "111");
// assertEquals(result.get("bbb"),"222");
//
// }
//}

Loading…
Cancel
Save