Spring Boot 2 - Свойство или поле 'entityProperties' не может быть найдено в null - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь перенести какой-то проект из Spring Boot 1.5 в Spring Boot 2.1.2

У меня есть библиотека bean-компонентов с именем common.jar, которая содержит несколько общих классов bean-компонентов, каждый из которых представляет Document в Mongo db.

Используя SPEL, я устанавливаю имя коллекции для каждого документа.

В другом приложении Spring Boot, использующем общую библиотеку, у меня есть компонент с именем entityProperties, который фактически загружает его поля из конфигурации и содержитимена коллекций.

Приложение хорошо работает в Spring Boot 1.5.x, однако в Spring Boot 2.1.2 я получаю исключение:

org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'entitiesProperties' cannot be found on null
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:213) ~[spring-expression-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:104) ~[spring-expression-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:91) ~[spring-expression-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.expression.spel.ast.CompoundExpression.getValueRef(CompoundExpression.java:53) ~[spring-expression-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:89) ~[spring-expression-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:114) ~[spring-expression-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:300) ~[spring-expression-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity.getCollection(BasicMongoPersistentEntity.java:97) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver.resolveIndexForEntity(MongoPersistentEntityIndexResolver.java:109) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver.resolveIndexFor(MongoPersistentEntityIndexResolver.java:90) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.checkForAndCreateIndexes(MongoPersistentEntityIndexCreator.java:134) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.checkForIndexes(MongoPersistentEntityIndexCreator.java:127) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.onApplicationEvent(MongoPersistentEntityIndexCreator.java:111) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.onApplicationEvent(MongoPersistentEntityIndexCreator.java:54) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:398) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:355) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:405) ~[spring-data-commons-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:248) ~[spring-data-commons-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:191) ~[spring-data-commons-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:85) ~[spring-data-commons-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2394) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2387) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:823) ~[spring-data-mongodb-2.1.4.RELEASE.jar:2.1.4.RELEASE]
    at com.opsc.demo.services.OnScheduleService.onSchedule(OnScheduleService.java:34) ~[classes/:na]

Это базовый интерфейс для всехобщие бобы

public interface BaseEntity extends Serializable {
    String getPid();
    void setPid(String pid);
    Long getTimeStamp();
    void setTimeStamp(Long timestamp);
    Boolean getCancelled();
    void setCancelled(Boolean cancelled);
    Boolean getProcessed();
    void setProcessed(Boolean processed);
    Date getCancelDate();
    void setCancelDate(Date cancelDate);
    Boolean getTransferrable();
    void setTransferrable(Boolean transferrable);
}

Это сущность, которую я пытаюсь найти в монго db

packace com.some.package

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;

// SPEL to get the name of the collection name as defined in config
@Document(collection = "#{entitiesProperties.getAdmissions()}")
public class Admission implements BaseEntity {
    private static final long serialVersionUID = -7793451827998043905L;

    @Id private String admissionId;
    private String pid;
    private Long timestamp = System.currentTimeMillis();

    //... some more fields and getters and setters
}

Это бин, содержащий имена коллекций

package com.some.package.utils;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component("entitiesProperties")
@ConfigurationProperties("some.mongodb")
public class EntitiesProperties {
  private String admissions;

    public OpscEntitiesProperties() {
    }

    public String getAdmissions() {
        return admissions;
    }

    public void setAdmissions(String admissions) {
        this.admissions = admissions;
    }

    // ... some more fields getters and setters
}

как работает код

Query q = new Query();
q.addCriteria(Criteria.where("processed").is(true).and("cancelled").is(false).and("dischargeDate").is(null));
List<Admission> admissions = mongoTemplate.find(q, Admission.class, "admissions");

Я понимаю, что в принципе, существует некоторая проблема с механизмом, который ищет сущности свойства в корреt контекста, однако, когда я устанавливаю контекст отображения mongodb на контекст приложения, он не оказывает никакого влияния.

Любая помощь приветствуется.

Гал.

1 Ответ

0 голосов
/ 14 марта 2019

Начиная с версии Spring Boot 2.1 +, правильный способ ссылки на bean-компонент в выражении Spel заключается в добавлении к его имени префикса @.Раньше он работал раньше, потому что Spring Data использовался для предоставления содержимого вашего ListableBeanFactory в контексте оценки.Правильный способ написания выражения Spel теперь:

@Document(collection = "#{@entitiesProperties.getAdmissions()}")

. Для получения дополнительной информации вы можете обратиться к этой проблеме: https://github.com/spring-projects/spring-boot/issues/15707

...