我们希望在单元测试中将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个以上
我认为这里的问题是如何在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