标签: applicationcontext

JUnit自定义运行器与Spring应用程序上下文

我是Spring的新手,我正在使用一套针对Web应用程序的JUnit 4.7集成测试.我有一些工作测试用例的形式:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/META-INF/spring/testContext.xml" })

public class myTest {
    @Test
    public void testCreate() {
            //execute tests
            ....
    }
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序有许多我正在测试的外部依赖项,所有这些都有通过加载testContext.xml初始化的bean .其中一些外部依赖项需要自定义代码来初始化和拆除必要的资源.

我不想在每个需要它的测试类中复制此代码,而是将其封装到一个公共位置.我的想法是创建一个单独的上下文定义以及一个自定义运行器,它扩展SpringJUnit4ClassRunner并包含@ContextConfiguration注释和相关的自定义代码,如下所示:

import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

//load the context applicable to this runner
@ContextConfiguration(locations = { "/META-INF/spring/testContext.xml" })

public class MyCustomRunner extends SpringJUnit4ClassRunner {

    public MyCustomRunner(Class<?> clazz) throws InitializationError {
        super(clazz);           
    }

    @Override
    protected Statement withBeforeClasses(Statement statement) {
        // …
Run Code Online (Sandbox Code Playgroud)

junit spring integration-testing applicationcontext

9
推荐指数
1
解决办法
3万
查看次数

如何在Spring中正确关闭ApplicationContext?

我正在攻读Spring Core认证,我对提供的学习资料中的这个问题有一些了解:

关闭应用程序上下文的首选方法是什么?

我知道如果我有这样的事情:

ConfigurableApplicationContext context = …
// Destroy the application
context.close();
Run Code Online (Sandbox Code Playgroud)

通过在context objet 上使用close()方法,ApplicationContext被关闭并且应用程序被销毁.

但我认为这不是我必须做的最佳方式.

阅读官方文档,我发现我也可以这样做:

context.registerShutdownHook();
Run Code Online (Sandbox Code Playgroud)

注册与JVM关闭挂钩,因此是将触发Spring的密切相JVM退出之前的JVM.所以在JVM退出时,Spring的关闭阶段将会执行.

在文档中,我可以读到:通常无法调用,context.close()因为许多应用程序(Web应用程序)无限期运行但是这最后一个断言究竟意味着什么?为什么Web应用程序无限期运行?

所以我的问题是:

  • 我是否可以使用第二种方式关闭应用程序上下文而不是Web应用程序?
  • 是否优先尊重context.close()

TNX

java spring spring-mvc applicationcontext

9
推荐指数
2
解决办法
2万
查看次数

java.lang.IllegalArgumentException:在EntityManagerFactory配置中没有指定PersistenceProvider

我创建了一个maven项目并通过pom.xml 添加了Spring4,Hibernate4库我试图将我的web应用程序与我在PostgreSql中创建的数据库链接,但是当我在apache tomcat 7中发布我的项目时,会发生以下异常:

org.springframework.beans.factory.BeanCreationException:在ServletContext资源[/WEB-INF/applicationContext.xml]中定义名为'emf'的bean时出错:init方法的调用失败; 嵌套异常是java.lang.IllegalArgumentException:在EntityManagerFactory配置中没有指定PersistenceProvider,并且选择的PersistenceUnitInfo没有在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)的org中指定提供者类名.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:

这是我的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"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">


    <context:component-scan base-package="com.medsoft.stadto">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:1993/Posts" />
        <property name="username" value="postgres" />
        <property name="password" value="123" />
    </bean>

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="emf">
        <property name="packagesToScan" value="com.medsoft.stadto.entity" />
        <property name="dataSource" ref="dataSource" />
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2dll.auto">create</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="txManager" /> …
Run Code Online (Sandbox Code Playgroud)

maven applicationcontext postgresql-9.1 hibernate-4.x spring-4

9
推荐指数
2
解决办法
1万
查看次数

在Spring3中注入applicationContext的最佳实践

正如在上面的标题中,我很困惑通过直接@Autowired注释注入applicationContext或在单例spring bean中实现ApplicationContextAware接口之间的优缺点.

您更喜欢哪一种?为什么?谢谢.

spring dependency-injection spring-3 applicationcontext

8
推荐指数
1
解决办法
2万
查看次数

Spring ApplicationContext.getBean(Class c)不适用于代理类

我需要通过类类型查找bean.当bean被代理包装时(某些方法是@Transactional) - ApplicatoinContext无法找到它们.我发现如果我通过接口查找它们,它可以工作,但在这种情况下,我正在使用具体的类类型.我知道bean是我正在寻找的类型,但getBean()方法失败.

我可以调试(并修复)Spring的AbstractBeanFactory代码中的问题.问题是它根据我要请求的类型检查beanInstance的类型,但beanInstance.getClass()是一个代理.AbstractBeanFactory应该对此进行补偿,并将类型与代理的目标类进行比较.

我有一个修复此问题,但我不是特别想使用修补版本的Spring,我怀疑必须有一些我可以配置来使这个工作,或者这真的是一个错误?

java proxy spring applicationcontext

8
推荐指数
1
解决办法
1万
查看次数

从applicationContext.xml中读取环境变量

我需要读取我的web.xml中定义的环境变量

<env-entry>
    <description>Path Repositorio NFS</description>
    <env-entry-name>PATH_ENV</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>C:/V3</env-entry-value>
</env-entry>
Run Code Online (Sandbox Code Playgroud)

从我的 applicationContext.xml

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="${PATH_ENV}/myprop.properties" />
</bean>
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点 ?


最后我做了下一个:

1在context.xml中定义环境变量:

<Environment name="PATH_ENV" type="java.lang.String"/>
Run Code Online (Sandbox Code Playgroud)

2在web.xml中定义env-entry

<env-entry>
    <description>Path Repositorio NFS</description>
    <env-entry-name>PATH_ENV</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>/WEB-INF/</env-entry-value>
  </env-entry>
Run Code Online (Sandbox Code Playgroud)

3在applicationContext.xml中定义

<bean id="configurationPath" class="org.springframework.jndi.JndiObjectFactoryBean">  
    <property name="jndiName">  
        <value>java:comp/env/PATH_ENV</value>  
    </property>  
</bean>  

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
       <property name="location">
            <bean factory-bean="configurationPath" factory-method="concat">
                <constructor-arg value="myprop.properties"/>
            </bean>
        </property>
    </bean>
Run Code Online (Sandbox Code Playgroud)

这是正确运行的,但是如果我在以下位置定义完整路径:

<env-entry-value>C:/V3/</env-entry-value>
Run Code Online (Sandbox Code Playgroud)

我有下一个问题:

java.io.FileNotFoundException: Could not open ServletContext resource [/C:/V3/aesantasa.properties]
Run Code Online (Sandbox Code Playgroud)

我无法在env-entry-value中定义完整路径为什么?

java xml spring applicationcontext

8
推荐指数
1
解决办法
1万
查看次数

如何在类注释@controller中获取Spring WebContext

在带有注释的Spring MVC中,我们使用@Controller标记任何POJO.在这个控制器中,我们可以使用autowired属性获取WebApplicationContext.

@Controller
public class HomePageController {

@Autowired
ApplicationContext act;

    @RequestMapping("/*.html")
    public String handleBasic(){
        SimpleDomain sd = (SimpleDomain)act.getBean("sd1");
        System.out.println(sd.getFirstProp());
        return "hello";
}
Run Code Online (Sandbox Code Playgroud)

但是在这种方法中,我们没有方便的servletContext.那么我们仍然可以使用较旧的方式获取WebApplicationContext吗?即

WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext)
Run Code Online (Sandbox Code Playgroud)

我们如何在这里获得servletContext?

我没有任何强迫使用旧方式; 所以这个问题只是出于好奇心来检查弹簧的灵活性.它也可以是一个面试问题.

spring servlets spring-mvc autowired applicationcontext

8
推荐指数
1
解决办法
2万
查看次数

修改活动配置文件并在Spring Boot应用程序中刷新ApplicationContext运行时

我有一个Spring启动Web应用程序.使用@Configurable注释通过java类配置应用程序.我介绍了两个配置文件:'install','normal'.如果安装配置文件处于活动状态,则不会加载任何需要数据库连接的Bean.我想创建一个控制器,用户可以在其中设置db连接参数.完成后我想将活动配置文件从'install'切换到'normal'并刷新应用程序上下文,这样Spring就可以初始化每个需要的bean数据库数据源.

我可以从代码中修改活动配置文件列表,没有问题,但是当我尝试刷新应用程序上下文时,我得到以下异常:

`java.lang.IllegalStateException:
 GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once`
Run Code Online (Sandbox Code Playgroud)

这是我启动Spring启动应用程序的方式:

`new SpringApplicationBuilder().sources(MyApp.class)
.profiles("my-profile").build().run(args);` 
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何启动春季启动应用程序让你多次刷新应用程序上下文?

java refresh applicationcontext spring-profiles spring-boot

8
推荐指数
1
解决办法
6355
查看次数

使用SpringApplication时加载applicationcontext.xml

任何人都可以提供一个加载applicationContext.xml文件的SpringApplication示例吗?

我正在尝试使用Spring的示例(基于Gradle)将我的GWT RPC应用程序移动到RESTful Web服务.我有一个applicationContext.xml,但我没有看到如何让SpringApplication加载它.通过手动加载

ApplicationContext context = new ClassPathXmlApplicationContext(args);

导致空的背景.......即使它起作用,也会与返回的那个分开

SpringApplication.run(Application.class, args);

或者有没有办法让外部bean进入SpringApplication.run创建的应用程序上下文?

applicationcontext spring-boot

8
推荐指数
2
解决办法
2万
查看次数

在spring boot中为liquibase配置dataSource

我有一个spring boot应用程序,我想为它添加liquibase配置更改日志.

我创建了一个用于配置liquibase的LiquibaseConfig类:

@Configuration
public class LiquibaseConfiguration {

    @Value("${com.foo.bar.liquibase.changelog}")
    private String changelog;

    @Autowired
    MysqlDataSource dataSource;

    @Bean
    public SpringLiquibase liquibase()  {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setDataSource(dataSource);
        liquibase.setChangeLog(changelog);
        return liquibase;
    }

}
Run Code Online (Sandbox Code Playgroud)

我已在属性文件中配置了数据源信息:

spring.datasource.url=jdbc:mysql://localhost:3306/dms
spring.datasource.username=root
spring.datasource.password=test
spring.datasource.testWhileIdle = true
spring.jpa.show-sql = true

#liquibase
com.foo.bar.liquibase.changelog=classpath:/db/changelog/db.changelog.xml
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序时,我收到此错误:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'liquibaseConfiguration': Unsatisfied dependency expressed through field 'dataSource': No qualifying bean of type [com.mysql.jdbc.jdbc2.optional.MysqlDataSource] found for dependency [com.mysql.jdbc.jdbc2.optional.MysqlDataSource]: expected at least 1 bean which qualifies as autowire candidate for this dependency. …
Run Code Online (Sandbox Code Playgroud)

liquibase applicationcontext spring-boot

8
推荐指数
1
解决办法
2万
查看次数