当前位置: 首页 > 知识库问答 >
问题:

如果资源注释中存在查找属性,如何使Spring执行真正的JNDI查找

亢奇
2023-03-14

我们希望在单元测试中将EJB-s作为Spring组件进行测试

使用Resources注释以查找JNDI值的EJB-s之一,如下所示:

@Resource(lookup = "java:global/myapp/portal/url")
private String portalUrl;

问题是Spring似乎试图按类型查找值,即它查找java类型的bean。字符串,而不是使用JNDI。

这是我们的代码。

第一个上下文:

<bean id="serverMock" class="myapp.JndiServerMock">
</bean>

第二个上下文:

<context:annotation-config />
<context:component-scan base-package="myapp">
    <context:include-filter type="annotation" expression="javax.ejb.Stateless" />
    <context:include-filter type="annotation"
        expression="javax.annotation.Resources" />
</context:component-scan>
<bean
    class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
    <property name="alwaysUseJndiLookup" value="true" />
</bean>

<bean id="clientMock" class="myapp.JndiClientMock">

<bean id="java:global/myapp/portal/url" class="java.lang.String">
    <constructor-arg value="http://localhost:8080" type="java.lang.String"/>
</bean>

JndiServerMock:

公共类JndiServerMock{

public JndiServerMock() throws IllegalStateException, NamingException {
    SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
    builder.bind("java:global/myapp/portal/url", "http://localhost:8080");
    builder.activate();
}

}

JndiClientMock:

公共类JndiClientMock{

public JndiClientMock() throws NamingException {
    Hashtable<String, String> prop = new Hashtable<String, String>();
    prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.springframework.mock.jndi.SimpleNamingContextBuilder");
    InitialContext ic = new InitialContext(prop);
    System.err.println("result = " + ic.lookup("java:global/myapp/portal/url"));
}

}

示例Bean:

@无状态公共类ExampleBean{

@Resource(lookup = "java:global/myapp/portal/url")
private String portalUrl;

public ExampleBean() {
    System.err.println("portalUrl = " + portalUrl);
}

}

公共类MainApp{

public static void main(String[] args) {
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.springframework.mock.jndi.SimpleNamingContextBuilder");

    ApplicationContext applicationContext = 
        new ClassPathXmlApplicationContext("/spring/firstContext.xml", 
            "/spring/secondContext.xml");

    ExampleBean exampleBean = applicationContext.getBean(ExampleBean.class); 
}

}

如果省略了“java:global/myapp/portal/url”bean定义,则会引发以下异常:

原因:组织。springframework。豆。工厂NoSuchBeanDefinitionException:未找到符合依赖关系的[java.lang.String]类型的合格bean:应至少有1个bean符合此依赖关系的autowire候选。依赖项注释:{@javax.annotation.Resource(shareable=true,lookup=java:global/myapp/portal/url,name=,description=,authenticationType=CONTAINER,type=class java.lang.Object,mappedName=)}位于org。springframework。豆。工厂支持DefaultListableBeanFactory。raisenouchbeandefinitionexception(DefaultListableBeanFactory.java:1301)位于org。springframework。豆。工厂支持DefaultListableBeanFactory。doResolveDependency(DefaultListableBeanFactory.java:1047)位于org。springframework。豆。工厂支持DefaultListableBeanFactory。resolveDependency(DefaultListableBeanFactory.java:942)位于org。springframework。上下文注释。CommonAnnotationBeanPostProcessor。org上的autowireResource(CommonAnnotationBeanPostProcessor.java:457)。springframework。上下文注释。CommonAnnotationBeanPostProcessor。位于org的getResource(CommonAnnotationBeanPostProcessor.java:435)。springframework。上下文注释。CommonAnnotationBeanPostProcessor$ResourceElement。位于org的getResourceToInject(CommonAnnotationBeanPostProcessor.java:559)。springframework。豆。工厂注释。InjectionMetadata$InjectedElement。在组织中注入(InjectionMetadata.java:169)。springframework。豆。工厂注释。注入元数据。在组织中注入(InjectionMetadata.java:88)。springframework。上下文注释。CommonAnnotationBeanPostProcessor。后处理属性值(CommonAnnotationBeanPostProcessor.java:305)。。。13个以上

共有1个答案

穆季萌
2023-03-14

我认为这里的问题是如何在Spring配置中设置JNDI条目——这里有一个如何做到这一点的例子。这提供了实现同样的事情的其他方法的例子。然而,如果你想为单元测试做这件事,我认为这里的JUnit部分可能是一个更简洁的方法,但是看起来你有很多选择!

 类似资料:
  • 例外的是,我必须在这个库中创建一个通过JNDI查找jdbc数据源的新类。 为此,下面是我的代码: 所有上下文都没有问题地实例化了。但是当它查找jdbc数据源时,我有一个例外:在上下文中找不到名称jdbc 我们不是在一个webapp,这是一个问题吗?是否可以使用ResourceLink声明context.xml?怎么做? 注意:jndi是在server.xml(GlobalNamingResourc

  • 我的代码无法使用JNDI查找JDBC资源。我得到以下异常: [根异常是javax.naming.nameNotFoundException:context:ppp-14415node01cell/nodes/ppp-14415node01/servers/server1,name:jdbc/admincob:未找到名称admincob中的第一个组件。[根异常是org.omg.cosnaming.n

  • 我是JavaEE6和JNDI新手,所以如果我的问题看起来微不足道,请原谅我 我已经添加了一个自定义资源Glassfish 3.1.2 JNDI资源通过该管理控制台: 共同任务- JNDI名称:someNumber 现在,我希望在作为ear部署到glassfish服务器的JavaEE应用程序中查找此资源。我试过这个,但运气不好: 我一直得到一个NameNotFoundExcema。你能告诉我我做错了

  • 问题内容: Go对于此SQL查询中的第二个参数想要什么。我正在尝试在postgres中使用查找。 我真正想要的是: 问题答案: 查询只是使用varargs来替换sql中的参数,因此,在您的示例中,您只需要执行 例如,这个和第二个示例的内容是动态的,那么您将 如果“ IN”部分具有可变的args,则可以执行(播放)

  • 问题内容: 有没有一种内置的方法来检查资源是否存在,或者我是否正在做类似以下的事情: 问题答案: 根据javadoc,您不需要尝试捕获:http : //developer.android.com/reference/android/content/res/Resources.html#getIdentifier%28java.lang.String,%20java.lang.String, %2