一、Integer值NULL转json变成0
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
二、@Configuration
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
我们都知道springboot的这个原理@SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan
- @Configuration:标注在类上,相当于把该类作为spring的xml配置文件中的,作用为:配置spring容器(应用上下文)
- @EnableAutoConfiguration:启用Spring
Boot的自动配置机制,类似在java代码中自动import,属于自动导入。 - @ComponentScan:扫描所有使用@Component 的类,不管自动导入还是导出,首先需要告诉spring
boot到哪里去找导入导出的原料。
@Configuration启动容器+@Bean注册Bean,@Bean下管理bean的生命周期
@Bean标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的,作用为:注册bean对象。@Bean 支持两种属性,即 initMethod 和destroyMethod,这些属性可用于定义生命周期方法。
注:
- @Bean注解在返回实例的方法上,如果未通过@Bean指定bean的名称,则默认与标注的方法名相同;
- @Bean注解默认作用域为单例singleton作用域,可通过@Scope(“prototype”)设置为原型作用域;
- 既然@Bean的作用是注册bean对象,那么完全可以使用@Component、@Controller、@Service、@Ripository等注解注册bean,当然需要配置@ComponentScan注解进行自动扫描。
- 若是另一个Bean中需要使用该注解类中的一个Bean,则以方法参数的形式传入,若是方法的参数名与某一个相应Bean的名字相同,则可以直接注入(不管是否有多个类型相同的Bean),若是没有与参数名相同的Bean,则按类型注入(只能有一个该类型的值),当有多个时会出现异常(不止一个)。
- 可以在类上使用@ComponentScan(basePackages=[])注解来扫描对应报下的类,若是相应包下的类上使用了@Controller,@Service,@Component,@Respository注解,则会将该类放入到IOC容器中管理。
- 可以在类上使用@Import(Class)把其他的@Configuration配置类进行合并。
- @ImportResource(“classpath:applicationContext-configuration.xml”):将xml文件中配置的bean,也引用到配置类中,以便在该配置类中使用xml文件中配置好的bean。
参考:参考1,参考2,@Component和@Configuration作为配置类的差别,参考4,参考5
三、通过Request请求获取IP地址
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();//返回发出请求的客户机的端口号。
}
四、MySQL中的substr()函数
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