自己的HttpTraceRepository

时间:2018-10-03 14:29:28

标签: spring-boot spring-boot-actuator

我创建了自己的HttpTraceRepository,用于在有限制的集合上从mongodb读写HTTPTrace。

今天,我不明白为什么HttpTrace是没有公共构造函数的最终类。

在我的情况下,当我阅读mongodb(findAll方法)以查找最近X个小时的http跟踪并将其显示在spring-boot管理员UI中时,不可能实例化HttpTrace对象。

@Component
public class MongoTraceRepository implements HttpTraceRepository {

private static final String ADMIN_TRACE = "admin.trace";
private MongoOperations mongoOps;

@Value("${admin.display.trace.last.x.hours}")
private int displayTraceLastXHours;

@Autowired
public MongoTraceRepository(MongoOperations mongoOps) {
    this.mongoOps = mongoOps;
}

@PostConstruct
public void initialize() {
    MongoCollection<Document> collection = mongoOps.getCollection(ADMIN_TRACE);
    boolean collectionExists = mongoOps.collectionExists(ADMIN_TRACE);
    if (!collectionExists) {
        collection.drop();
        // 100 Mo max, 500 000 documents max, capped !
        mongoOps.createCollection(ADMIN_TRACE, CollectionOptions.empty().size(104857600).maxDocuments(500000).capped());
    }
}

@Override
public List<HttpTrace> findAll() {
    Date yesterday = Date.from(LocalDateTime.now().minusHours(displayTraceLastXHours).atZone(ZoneId.systemDefault()).toInstant());


    return mongoOps.find(new Query(where("timestamp").gte(yesterday)), HttpTrace.class, ADMIN_TRACE)
            .stream()
            .sorted((o1, o2) -> o2.getTimestamp().compareTo(o1.getTimestamp()))
            .collect(Collectors.toList());
}

@Override
@Async
public void add(HttpTrace traceInfo) {
    mongoOps.save(traceInfo, ADMIN_TRACE);
}

}

这是错误日志:

org.springframework.data.mapping.MappingException: No property request found on entity class org.springframework.boot.actuate.trace.http.HttpTrace$Request to bind constructor parameter to!
at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:68)
at org.springframework.data.mapping.model.SpELExpressionParameterValueProvider.getParameterValue(SpELExpressionParameterValueProvider.java:49)
at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:75)
at org.springframework.data.convert.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:86)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:273)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:253)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1387)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1334)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1276)
at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:71)
at org.springframework.data.mapping.model.SpELExpressionParameterValueProvider.getParameterValue(SpELExpressionParameterValueProvider.java:49)
at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:75)
at org.springframework.data.convert.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:86)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:273)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:253)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:202)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:198)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:86)
at org.springframework.data.mongodb.core.MongoTemplate$ReadDocumentCallback.doWith(MongoTemplate.java:2785)
at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:2448)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2244)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2227)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:770)

1 个答案:

答案 0 :(得分:0)

有一个特别适合从持久性存储中创建HTTPTrace的构造函数。

它是从 2.1.0起添加的