Integer值NULL转json变成0+@Configuration,@Bean+通过Request请求获取IP地址+MySQL中的substr()函数+其他记录=10/26-10/30

9 篇文章 0 订阅

一、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

  1. @Configuration:标注在类上,相当于把该类作为spring的xml配置文件中的,作用为:配置spring容器(应用上下文)
  2. @EnableAutoConfiguration:启用Spring
    Boot的自动配置机制,类似在java代码中自动import,属于自动导入。
  3. @ComponentScan:扫描所有使用@Component 的类,不管自动导入还是导出,首先需要告诉spring
    boot到哪里去找导入导出的原料。

@Configuration启动容器+@Bean注册Bean,@Bean下管理bean的生命周期
@Bean标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的,作用为:注册bean对象。@Bean 支持两种属性,即 initMethod 和destroyMethod,这些属性可用于定义生命周期方法。
注:

  1. @Bean注解在返回实例的方法上,如果未通过@Bean指定bean的名称,则默认与标注的方法名相同;
  2. @Bean注解默认作用域为单例singleton作用域,可通过@Scope(“prototype”)设置为原型作用域;
  3. 既然@Bean的作用是注册bean对象,那么完全可以使用@Component、@Controller、@Service、@Ripository等注解注册bean,当然需要配置@ComponentScan注解进行自动扫描。
  4. 若是另一个Bean中需要使用该注解类中的一个Bean,则以方法参数的形式传入,若是方法的参数名与某一个相应Bean的名字相同,则可以直接注入(不管是否有多个类型相同的Bean),若是没有与参数名相同的Bean,则按类型注入(只能有一个该类型的值),当有多个时会出现异常(不止一个)。
  5. 可以在类上使用@ComponentScan(basePackages=[])注解来扫描对应报下的类,若是相应包下的类上使用了@Controller,@Service,@Component,@Respository注解,则会将该类放入到IOC容器中管理。
  6. 可以在类上使用@Import(Class)把其他的@Configuration配置类进行合并。
  7. @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();//返回发出请求的客户机的端口号。
}

参考:参考1参考2

四、MySQL中的substr()函数

mysql中的各类函数在学的时候都学,但是实际中用到的不多。这次实际碰到一个,正好记录一下。

/**
 * 地域表中地区代码字段多了个点零(123123123123.0),
 * 以下代码可把点零去掉。substr(str,pos,len);//str:字符串,pos:起始位置,len:截断长度
 */

UPDATE 地域 
SET 地区代码 = SUBSTR( 地区代码, 1, LENGTH( 地区代码 ) - 2 ) 
WHERE
    地区代码 like "%.%"

另:substr()用法:

//str:字符串,pos:起始位置,len:截断长度
1substr(str,pos);
2substr(str from pos);
3substr(str,pos,len);
4substr(str from pos len);

参考:参考1

五、其他记录

  1. instanceof 在list
  2. 串行代码性能优化
  3. maven仓库中心mirrors配置多个下载中心(执行最快的镜像)
  4. Intellij IDEA集成JProfiler性能分析神器JProfiler的安装和使用
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值