1)场景:有时候返回给前端数据的时候,有的Integer值是允许为空的,那么我就设置为null返回。但是用postman测试出来收到的数据却显示Integer值为0。(但往往前端需要的是null值,如果用该Integer值作为id参数再传回后端时候是0,那用id=0去查数据库很可能会报错)
2)问题出错点:打断点一步一步走下来发现,该值确实一直都是null。但是到转换json格式返回过后就成了0。那问题就出在json转换这里。
3)解决办法:1、加代码:
// An highlighted block
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerDefaultValueProcessor(Integer.class, //定义Integer为null时 转为json 还是null
new DefaultValueProcessor(){
public Object getDefaultValue(Class type) {
return null;
}
});
JSONObject json = JSONObject.fromObject(JavaBean,jsonConfig);
2、修改全局配置:
自定义配置类,继承WebMvcConfigurationSupport。重写configureMessageConverters方法。将WriteNullNumberAsZero
删除。
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setCharset(StandardCharsets.UTF_8);
fastJsonConfig.setSerializerFeatures(
DisableCircularReferenceDetect,
PrettyFormat,
WriteEnumUsingName,
WriteNullBooleanAsFalse,
WriteNullNumberAsZero,//这一句删除!!
WriteNullStringAsEmpty,
WriteNullListAsEmpty,
WriteMapNullValue,
SkipTransientField,
SortField
);
converter.setFastJsonConfig(fastJsonConfig);
converters.add(converter);
}
3)对于想传null不传0是以上俩方法。但是具体业务上也可以前后端做约定加判断。
参考:https://blog.csdn.net/qq_31273003/article/details/84581482
https://jingyan.baidu.com/article/36d6ed1f8566a91bcf488324.html
https://www.cnblogs.com/huangjian2/p/6237116.html
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
我们都知道springboot的这个原理@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan
@Configuration启动容器+@Bean注册Bean,@Bean下管理bean的生命周期
@Bean标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的,作用为:注册bean对象。@Bean 支持两种属性,即 initMethod 和destroyMethod,这些属性可用于定义生命周期方法。
注:
参考:参考1,参考2,@Component和@Configuration作为配置类的差别,参考4,参考5
public class IpAddressUtil {
/**
* 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址,
* 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?
* 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。
* 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130,
*
* 192.168.1.100
*
* 用户真实IP为: 192.168.1.110
*
* 如果 X-Forwarded-For 获取不到,就去获取X-Real-IP ,X-Real-IP 获取不到,就依次获取Proxy-Client-IP 、WL-Proxy-Client-IP 、HTTP_CLIENT_IP 、 HTTP_X_FORWARDED_FOR 。最后获取不到才通过request.getRemoteAddr()获取IP,
*
* X-Real-IP 就是记录请求的客户端真实IP。跟X-Forwarded-For 类似。
*
* Proxy-Client-IP 顾名思义就是代理客户端的IP,如果客户端真实IP获取不到的时候,就只能获取代理客户端的IP了。
*
* WL-Proxy-Client-IP 是在Weblogic下获取真实IP所用的的参数。
*
* HTTP_CLIENT_IP 与 HTTP_X_FORWARDED_FOR 可以理解为X-Forwarded-For , 因为它们是PHP中的用法。
*
* @param request
* @return
*/
private static String getIpAddress(HttpServletRequest request) {
String Xip = request.getHeader("X-Real-IP");
String XFor = request.getHeader("X-Forwarded-For");
if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = XFor.indexOf(",");
if(index != -1){
return XFor.substring(0,index);
}else{
return XFor;
}
}
XFor = Xip;
if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
return XFor;
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getRemoteAddr();
}
return XFor;
}
}
另:HttpServletRequest 中其他方法:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String uri = request.getRequestURI();//返回请求行中的资源名称
String url = request.getRequestURL().toString();//获得客户端发送请求的完整url
String ip = request.getRemoteAddr();//返回发出请求的IP地址
String params = request.getQueryString();//返回请求行中的参数部分
String host=request.getRemoteHost();//返回发出请求的客户机的主机名
int port =request.getRemotePort();//返回发出请求的客户机的端口号。
}
参考:参考1,参考2
mysql中的各类函数在学的时候都学,但是实际中用到的不多。这次实际碰到一个,正好记录一下。
/**
* 地域表中地区代码字段多了个点零(123123123123.0),
* 以下代码可把点零去掉。substr(str,pos,len);//str:字符串,pos:起始位置,len:截断长度
*/
UPDATE 地域
SET 地区代码 = SUBSTR( 地区代码, 1, LENGTH( 地区代码 ) - 2 )
WHERE
地区代码 like "%.%"
另:substr()用法:
//str:字符串,pos:起始位置,len:截断长度
1、substr(str,pos);
2、substr(str from pos);
3、substr(str,pos,len);
4、substr(str from pos len);
参考:参考1