美文网首页
五月三周技术复盘

五月三周技术复盘

作者: 剑道_7ffc | 来源:发表于2020-05-27 11:03 被阅读0次

    postgresql的execute

    execute表示执行动态命令,即含有变量的db

    更新表的创建时间为timestamptz(3)

    CREATE OR REPLACE FUNCTION public.tmp_update_create_modify_time()
      RETURNS VARCHAR AS
    $BODY$
    DECLARE
    
    tableNameRecordCursor REFCURSOR;
    tableNameRecord RECORD;
    tablename VARCHAR;
    
    BEGIN
          OPEN tableNameRecordCursor FOR 
                SELECT 
                    c.relname tableName
                FROM
                    pg_class AS c,
                    pg_attribute AS a 
                WHERE a.attrelid = c.oid 
                    AND a.attnum > 0 
                    AND a.attname in('modify_time');
            LOOP
                FETCH tableNameRecordCursor INTO tableNameRecord;
                IF NOT FOUND THEN
                    RAISE NOTICE '没有找到表名';
                    EXIT;
                END IF;
    
                EXECUTE 'ALTER TABLE ' || tableNameRecord.tableName || 
                ' ALTER COLUMN "modify_time" TYPE timestamptz(3)';
         END LOOP;
    
        RETURN '成功';
    END 
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    

    spring默认的集合绑定大小

    spring默认的值

    org.springframework.validation.DataBinder#setAutoGrowCollectionLimit默认是256

    /** Default limit for array and collection growing: 256 */
    public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT = 256;
    

    手动修改

    DataBinder是PropertyEditorRegistry的实现类,所以通过实现PropertyEditorRegistrar来编辑DataBinder的值

    public class CustomPropertyEditorRegistrar implements PropertyEditorRegistrar {
        @Override
        public void registerCustomEditors(PropertyEditorRegistry registry) {
            //当对象属性有集合时修改数据绑定的List的默认值256
            if(registry instanceof DataBinder){
                ((DataBinder)registry).setAutoGrowCollectionLimit(3000);
            }
        }
    }
    

    fastjson的空异常的问题

    在json时get方法中报空指针异常

    public boolean isGroupBuild(){
            return super.getParentHospitalId().equals(super.getGroupHospitalId());
    }
    

    源码分析

    com.fasterxml.jackson.databind.ser.BeanSerializerBuilder#build

    创建序列化的对象

    com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector#collectAll

    收集所有的属性

    protected void collectAll()
    {
        LinkedHashMap<String, POJOPropertyBuilder> props = new LinkedHashMap<String, POJOPropertyBuilder>();
    
        // First: gather basic data
        _addFields(props);
        _addMethods(props);
    }
    
    com.fasterxml.jackson.databind.util.BeanUtil#okNameForRegularGetter

    如将getStudentName变成studentName

    com.fasterxml.jackson.databind.util.BeanUtil#okNameForIsGetter

    如将isGroupBuild变成groupBuild

    com.fasterxml.jackson.databind.ser.std.BeanSerializerBase#serializeFields

    循环获取值

    解决办法

    修改方法名

    因为fastJson会把get开头和字段当做属性,所以若不想反射调用可以改为其他名称如fetch

    使用注解不序列化改字段

    @Transient:针对所有的序列化,不序列化改方法
    @JsonIgnore:针对fastJson

    相关文章

      网友评论

          本文标题:五月三周技术复盘

          本文链接:https://www.haomeiwen.com/subject/tcviahtx.html