Java introspection: object to map

后端 未结 7 988
无人及你
无人及你 2020-11-28 05:52

I have a Java object obj that has attributes obj.attr1, obj.attr2 etc. The attributes are possibly accessed through an extra level of

7条回答
  •  伪装坚强ぢ
    2020-11-28 06:21

    maven dependencies

        
            com.fasterxml.jackson.datatype
            jackson-datatype-jsr310
        
    

    ....

    ObjectMapper m = new ObjectMapper();
    Map mappedObject = m.convertValue(myObject,Map.class);
    

    for JSR310 New Date/Time API,there are some issue need to be improved eg:

    import com.alibaba.fastjson.JSON;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.junit.Test;
    
    import java.sql.Timestamp;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.util.Map;
    
    @Data
    @NoArgsConstructor
    public class QueryConditionBuilder
    {
        LocalDateTime startTime;
        LocalDateTime endTime;
        Long nodeId;
        Long fsId;
        Long memId;
        Long ifCardId;
    
        private QueryConditionBuilder(QueryConditionBuilder.Builder builder) {
            setStartTime(builder.startTime);
            setEndTime(builder.endTime);
            setNodeId(builder.nodeId);
            setFsId(builder.fsId);
            setMemId(builder.memId);
            setIfCardId(builder.ifCardId);
        }
    
        public static QueryConditionBuilder.Builder newBuilder() {
            return new QueryConditionBuilder.Builder();
        }
    
        public static QueryConditionBuilder newEmptyBuilder() {
            return new QueryConditionBuilder.Builder().build();
        }
    
    
        public Map toFilter()
        {
            Map filter = new ObjectMapper().convertValue(this,Map.class);
            System.out.printf("查询条件:%s\n", JSON.toJSONString(filter));
            return filter;
        }
    
        public static final class Builder {
            private LocalDateTime startTime;
            private LocalDateTime endTime;
            private Long nodeId = null;
            private Long fsId = null;
            private Long memId =null;
            private Long ifCardId = null;
    
            private Builder() {
            }
    
            public QueryConditionBuilder.Builder withStartTime(LocalDateTime val) {
                startTime = val;
                return this;
            }
    
            public QueryConditionBuilder.Builder withEndTime(LocalDateTime val) {
                endTime = val;
                return this;
            }
    
            public QueryConditionBuilder.Builder withNodeId(Long val) {
                nodeId = val;
                return this;
            }
    
            public QueryConditionBuilder.Builder withFsId(Long val) {
                fsId = val;
                return this;
            }
    
            public QueryConditionBuilder.Builder withMemId(Long val) {
                memId = val;
                return this;
            }
    
            public QueryConditionBuilder.Builder withIfCardId(Long val) {
                ifCardId = val;
                return this;
            }
    
            public QueryConditionBuilder build() {
                return new QueryConditionBuilder(this);
            }
        }
    
        @Test
        public void test()
        {     
            LocalDateTime now = LocalDateTime.now(ZoneId.of("+8"));
            LocalDateTime yesterday = now.plusHours(-24);
    
            Map condition = QueryConditionBuilder.newBuilder()
                    .withStartTime(yesterday)
                    .withEndTime(now)
                    .build().toFilter();
    
            System.out.println(condition);
        }
    }
    

    expects(pseudo-code):

    查询条件:{"startTime":{"2019-07-15T20:43:15"},"endTime":{"2019-07-16T20:43:15"}
    {startTime={2019-07-15T20:43:15}, endTime={"2019-07-16T20:43:15"}, nodeId=null, fsId=null, memId=null, ifCardId=null}
    

    instead,i got these:

    查询条件:{"startTime":{"dayOfMonth":15,"dayOfWeek":"MONDAY","dayOfYear":196,"hour":20,"minute":38,"month":"JULY","monthValue":7,"nano":263000000,"year":2019,"second":12,"chronology":{"id":"ISO","calendarType":"iso8601"}},"endTime":{"dayOfMonth":16,"dayOfWeek":"TUESDAY","dayOfYear":197,"hour":20,"minute":38,"month":"JULY","monthValue":7,"nano":263000000,"year":2019,"second":12,"chronology":{"id":"ISO","calendarType":"iso8601"}}}
    {startTime={dayOfMonth=15, dayOfWeek=MONDAY, dayOfYear=196, hour=20, minute=38, month=JULY, monthValue=7, nano=263000000, year=2019, second=12, chronology={id=ISO, calendarType=iso8601}}, endTime={dayOfMonth=16, dayOfWeek=TUESDAY, dayOfYear=197, hour=20, minute=38, month=JULY, monthValue=7, nano=263000000, year=2019, second=12, chronology={id=ISO, calendarType=iso8601}}, nodeId=null, fsId=null, memId=null, ifCardId=null}
    

    after a few research,an effective trick was found,

    ObjectMapper mapper = new ObjectMapper();
    JavaTimeModule module = new JavaTimeModule();
    //https://github.com/networknt/light-4j/issues/82
    mapper.registerModule(module);
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    //incase of empty/null String
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
    Map filter = mapper.convertValue(this,Map.class);
    System.out.printf("查询条件:%s\n", JSON.toJSONString(filter));
    return filter;
    

    output:

    查询条件:{"startTime":"2019-07-15T21:29:13.711","endTime":"2019-07-16T21:29:13.711"}
    {startTime=2019-07-15T21:29:13.711, endTime=2019-07-16T21:29:13.711, nodeId=null, fsId=null, memId=null, ifCardId=null}
    

    I used the above code for dynamical query in MyBatis
    eg.

     /***
         * 查询文件系统使用率
         * @param condition
         * @return
         */
        LinkedList queryFileSystemUsage(Map condition);
    
        List fooBar()
        { 
           return snmpBaseMapper.queryFileSystemUsage(QueryConditionBuilder
                    .newBuilder()
                    .withNodeId(nodeId)
                    .build()
                    .toFilter());
        }
    

提交回复
热议问题