我试图创建Hibernate Validator bean,并遇到这个问题,从另一个类中的静态工厂方法创建一个bean.我找到了一种Spring方法来初始化我的Validator bean(底部的解决方案),但问题本身仍未解决.验证器在此处用作示例案例.
这就是我在Java中创建Validator实例的方法
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Run Code Online (Sandbox Code Playgroud)
这就是我尝试在applicationContext.xml中创建bean的方法
<bean id="validatorFactory"
class="javax.validation.ValidatorFactory"
factory-method="javax.validation.Validation.buildDefaultValidatorFactory" />
<bean id="validator"
class="javax.validation.Validator"
factory-bean="validatorFactory"
factory-method="getValidator" />
Run Code Online (Sandbox Code Playgroud)
我的理解是,在"工厂方法"中,您只能访问在"class"参数中定义的类中定义的静态方法.由于方法buildDefaultValidatorFactory()是静态的,我不能创建一个Validation实例,并将它作为validatorFactory的"factory-bean"给出,如下所示:
<bean id="validation" class="javax.validation.Validation" />
<bean id="validatorFactory"
class="javax.validation.ValidatorFactory"
factory-bean="validation"
factory-method="buildDefaultValidatorFactory" />
Run Code Online (Sandbox Code Playgroud)
这最终会出现错误消息
"检查是否存在具有指定名称的方法,并且它是非静态的 "
问题是你如何在Spring的这种情况下创建bean?
这就是我解决Validator问题的方法:
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
Run Code Online (Sandbox Code Playgroud) 我有以下ApplicationListener:
package org.mycompany.listeners;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStartedEvent;
public class MyApplicationListener implements ApplicationListener<ContextStartedEvent> {
public MyApplicationListener() {
super();
System.out.println("Application context listener is created!");
}
/**
* {@inheritDoc}
*/
public void onApplicationEvent(final ContextStartedEvent event) {
System.out.println("Context '" + event.getApplicationContext().getDisplayName() + "' is started!");
}
}
Run Code Online (Sandbox Code Playgroud)
以下bean定义:
<bean name="myApplicationListener" class="org.mycompany.listeners.MyApplicationListener" />
Run Code Online (Sandbox Code Playgroud)
我可以看到bean是在打印构造函数的消息时创建的,但是从不收到上下文启动事件.我错过了什么?
我正在创建一个Maven Spring项目,其中包括MVC,数据和安全性.我的Spring applicationContext - *.xml文件位于\ src\main\resources\spring \
我的TestCase放在\ src\test\java\my\package\controller \中,其代码为:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:spring/applicationContext.xml",
"classpath:spring/applicationContext-jpa.xml",
"classpath:spring/applicationContext-security.xml" })
public class MyControllerTest extends TestCase {
@Autowired
private MyController myController;
@Test
public void myMethod_test() {
}
}
Run Code Online (Sandbox Code Playgroud)
当我右键单击测试类并以JUnit运行时,我得到了
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:101)
at
[...]
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException:
IOException parsing XML document from class path resource
[applicationContext.xml]; nested exception is java.io.FileNotFoundException:
class path resource [applicationContext.xml] cannot be opened because it does not exist
[...]
Run Code Online (Sandbox Code Playgroud)
如果我尝试从位置删除applicationContext.xml,我仍然会得到完全相同的错误.完整的堆栈跟踪是这样的:
java.lang.IllegalStateException: Failed to …Run Code Online (Sandbox Code Playgroud) 我的WEB-INF目录下有一些XML文件:
servlet xml导入其他xml文件:
<import resource="dataSource.xml"/>
<import resource="hibernate.xml"/>
<import resource="beans.xml"/>
Run Code Online (Sandbox Code Playgroud)
我希望我的junit4 JukeboxTest类包含整个弹簧配置.使用默认文件名我创建了一个JukeboxTest-content.xml文件.最后,我不知道该放什么......
我试过了:
<import resource="/WEB-INF/dataSource.xml"/>
<import resource="/WEB-INF/hibernate.xml"/>
<import resource="/WEB-INF/beans.xml"/>
Run Code Online (Sandbox Code Playgroud)
要么
<import resource="classpath:./WEB-INF/dataSource.xml"/>
<import resource="classpath:./WEB-INF/hibernate.xml"/>
<import resource="classpath:./WEB-INF/beans.xml"/>
Run Code Online (Sandbox Code Playgroud)
和其他一些想法,但都失败了.有人能指出我如何访问这些文件以及spring解释这些文件路径的方式是什么?
以下架构被吹捧为从我的Android应用程序中的任何位置获取应用程序上下文的方式.但有时候MyApp.getContext()返回null.我尝试通过删除static来改变模式,getContext()以便我这样做MyApp.getInstance().getContext().它仍然返回null.我该如何解决?如何从我的应用程序中的任何位置获取应用程序的上下文?
public class MyApp extends Application {
private static MyApp instance;
public static MyApp getInstance() {
return instance;
}
public static Context getContext() {
return instance.getApplicationContext();
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
}
Run Code Online (Sandbox Code Playgroud) 当谈到Spring MVC Application时,我对两个ApplicationContext和ServletContext感到困惑.我知道每个Spring Web应用程序只有一个ApplicationContext,每个Web应用程序也只有一个ServletContext.要在web.xml中启动ApplicationContext和ServletContext的值,我们将在context-param标记中添加一些内容.
这让我感到困惑.这两者之间有什么区别(我知道ApplicationContext有一些方法可以使用bean)?而当我们将使用的ApplicationContext和当我们将使用ServletContext的?
一个可能有高级答案的简单问题.
问题:我的问题是,有没有办法在应用程序上下文中仅实例化特定JUnit测试所需的类?
原因:我的应用程序环境变得非常大.我也做了很多集成测试,所以你猜我会理解当我说每次运行测试时,我的应用程序上下文中的所有类都会被实例化,这需要时间.
这个例子:
说类Foo只注入吧
public class Foo {
@Inject
Bar bar;
@Test
public void testrunSomeMethod() throws RegisterFault {
bar.runSomeMethod();
}
Run Code Online (Sandbox Code Playgroud)
但是应用程序上下文有bean foobar和bar.我知道这不是一个虚拟应用程序上下文,但请确保我的所有代码都能正常工作.
<beans>
<bean id="foobar" class="some.package.FooBar"/>
<bean id="bar" class="some.package.Bar"/>
<beans>
Run Code Online (Sandbox Code Playgroud)
那么我如何告诉spring只实例化Bar并忽略测试类foo的FooBar.
谢谢.
我有一个Spring bean的图表,它们互相自动装配.重度简化的插图:
<context:annotation-config/>
<bean class="Foo"/>
<bean class="Bar"/>
<bean class="Baz"/>
...
public class Foo {
@Autowired Bar bar;
@Autowired Baz baz;
}
public class Bar {
@Autowired Foo foo;
}
public class Baz {
@Autowired Foo foo;
}
Run Code Online (Sandbox Code Playgroud)
所有这些bean都没有指定范围,这意味着它们是单例(使它们显式单例不会改变任何东西,我已经尝试过了).
问题是在单个应用程序上下文实例化后,实例Bar和Baz包含不同的实例Foo.怎么会发生这种情况?
我试图创建public no args构造函数,Foo并且已经确认已经多次创建调试Foo.所有这些创作的堆栈跟踪都在这里.
我还尝试为Spring启用调试日志记录,并在所有其他行中获得以下内容:
DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Foo'
DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Foo'
DEBUG …Run Code Online (Sandbox Code Playgroud) 我有一个带有PropertyPlaceholderConfigurer的Spring application-context.xml,用于从.properties文件中获取属性值.主文件夹和测试源文件夹具有单独的.properties文件.问题是我需要在.properties文件中使用环境变量.但是,当我按以下方式执行此操作时:
property.name=${env.SYSTEM_PROPERTY}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'beanName' defined in class path resource [com/example/applicationContext.xml]: Could not resolve placeholder 'env.SYSTEM_PROPERTY'
Run Code Online (Sandbox Code Playgroud)
而占位符配置器定义为
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:com/example/application.properties"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
任何想法如何使property.name被解释为环境变量(而不是占位符)?
最好的问候,德米特里.
java spring environment-variables properties-file applicationcontext
我有一个相对较小的Java库,它实现了几十个bean(没有数据库或GUI).我创建了一个Spring Bean配置文件,其他Java项目使用它来将我的bean注入其中.
我现在第一次尝试使用Spring Test将一些bean注入我的junit测试类(而不是简单地实例化它们).
我这样做部分是为了学习Spring Test,部分是为了强制测试使用我为其他人提供的相同bean配置文件.
在Spring文档中说我需要使用Spring附带的"TestContext"类创建应用程序上下文.我相信这应该在一个spring XML文件中完成,我通过我的测试类上的@ContextConfiguration注释来引用它.
@ContextConfiguration({"/test-applicationContext.xml"})
Run Code Online (Sandbox Code Playgroud)
但是,没有提示要放入文件中的内容!
当我从Eclipse中运行我的测试时,它错误地说"无法加载应用程序上下文"....当然.
更新:
这是test-applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<description>Holds application context for testing of the domain module.</description>
<!-- Imports the uuid generator bean definitions -->
<import resource="resources/domain-uuid.xml"/>
</beans>
Run Code Online (Sandbox Code Playgroud)
我的项目目录是这样的:
domain/
src/
main/
java/
resources/
test/
java/
resources/ (location of test-applicationContext.xml)
Run Code Online (Sandbox Code Playgroud)
只是为了好玩我还尝试通过"mvn clean test"从mvn命令行构建,我得到了以下错误,这可能是我真正的问题:
package org.springframework.test.context does not exist
package org.springframework.test.context.junit4 does not exist
cannot find symbol
symbol: class ContextConfiguration
@ContextConfiguration({"/resources/test-applicationContext.xml"})
cannot find symbol
symbol: …Run Code Online (Sandbox Code Playgroud)