当前位置: 首页 > 面试题库 >

@Document批注中的MongoDB和SpEL表达式

梁丘招
2023-03-14
问题内容

我正在尝试使用SpEL根据我定义的一些规则将同一文档加载到不同的集合中。

因此,从我所拥有的开始:

-首先文件:

@Document(collection = "#{@mySpecialProvider.getTargetCollectionName()}")
public class MongoDocument {
// some random fields go in
}

-秒我有应该提供集合名称的提供者bean:

@Component("mySpecialProvider")
public class MySpecialProvider {

public String getTargetCollectionName() {
// Thread local magic goes in bellow
    String targetCollectionName = (String) RequestLocalContext.getFromLocalContext("targetCollectionName");
    if (targetCollectionName == null) {
        targetCollectionName = "defaultCollection";
    }
    return targetCollectionName;
 }
}

问题是,当我尝试将文档插入应由提供程序生成的特定集合中时,我得到以下stacktrace:

org.springframework.expression.spel.SpelEvaluationException:EL1057E
:(位置1):在上下文中未注册任何用于解析对bean’mySpecialProvider’的访问的bean解析器

我也尝试制作Spring组件 ApplicationContextAware, 但还是没有运气。


问题答案:

如我所言,我将回答我的问题。要使其正常工作,您需要在应用程序上下文XML文件中对 mongoTemplate bean进行以下设置:

<mongo:db-factory dbname="${myDatabaseName.from.properties.file}" mongo-ref="mongo"/>
<bean id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext"/>   
<bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter" c:mongoDbFactory-ref="mongoDbFactory"
            c:mappingContext-ref="mongoMappingContext"/>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"
            c:mongoDbFactory-ref="mongoDbFactory" c:mongoConverter-ref="mappingMongoConverter"/>

并使用上面的设置和我在问题中建议的解决方案。您可以使用相同的域对象,并根据您选择的设置将其存储到多个集合中。

编辑:

由于有人在相关问题中提出了要求,因此我还将在这里更新ThreadLocal上下文的逻辑:

创建一个 RequestLocalContext 类,该类包装以下实现:

private static final ThreadLocal<Map> CONTEXT = new ThreadLocal<Map>() {
        protected Map initialValue() {
            Map localMap = new HashMap();
            localMap.put(LocalContextKeys.CONVERSATION_CONTEXT, new HashMap());
            return localMap;
        };
    };

public static void putInLocalContext(Object key, Object value) {
    Map localMap = CONTEXT.get();
    localMap.put(key, value);
}

 public static Object getFromLocalContext(Object key) {
    Map localMap = CONTEXT.get();
    return localMap.get(key);
}

其中 LocalContextKeys 是一个枚举,其中包含 ThreadLocal 上下文 映射中
允许的键。请注意,这些键是用户定义的,因此可以随意将其放置在其中。



 类似资料:
  • 长话短说: 是否有一种方法可以将生成的字符串解释为注释中的SpEL表达式,而不使用转换器,例如)? 我认为将被宏展开,然后由计算为对应的SpEL表达式,上面示例中的。不幸的是,情况并非如此,加载Spring上下文会导致一个错误,说明它无法将字符串(属性的值)转换为目标类型。 现在,我通过编写一个实现的类来解决这个问题,但这非常复杂,因为我需要通过实例化等以编程方式将字符串计算为SpEL表达式。 但

  • 主要内容:示例,SpEL对Bean定义的支持,SpEL中的运算符,SpEL中的变量Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言,支持运行时查询和操作对象图 。表达式语言一般是用最简单的形式完成最主要的工作,以此减少工作量。 Java 有许多可用的表达式语言,例如 JSP EL,OGNL,MVEL 和 JBoss EL,SpEL 语法类似于 JSP EL,功能类似于 Struts2 中的 OGNL,能在运行时构建复杂表达式、存取

  • 我有一个属性类: 我在@Configuration类中启用配置属性,如下所示: 在同一个类(“SomeAutoConfiguration”)中,我想创建另一个bean,具体取决于SomeProperties中的list属性是否为空。我想我可以将@ConditionalExpression与以下SpEl结合使用: SpEl是正确的,但我无法获得包含我的属性的bean。使用上面的表达式,我遇到了 EL

  • 我想知道为什么spring不直接计算所有表达式,因为它们是从属性文件注入到

  • 问题内容: 与何时使用相比,我有点困惑。Spring的文档仅使用,但是有许多使用示例。此外,当我开始使用SpEL时,我被告知要使用它,并且效果很好。 对于那些感到困惑的人来说,我将如何使用它 和一些属性文件: 我的问题是: 有什么区别或相同? 一个版本被弃用了,所以我应该使用另一个版本吗? 问题答案: 是属性占位符语法。它只能用于取消引用属性。 是SpEL语法,它的功能和复杂性要高得多。它也可以处

  • 问题内容: 我需要使用批注+正则表达式对电子邮件进行验证。我尝试使用以下内容: 但是,当电子邮件字段中的电子邮件地址不正确时,我不知道如何打印错误消息。有任何想法吗? 问题答案: 首先,您应该在注释中添加一个属性。假设您的邮件变量是某个类User的一部分: 然后,您应该定义一个验证器: 然后找到验证错误。