标签: spring-java-config

如何将Spring配置为部分和可选地覆盖属性?

我希望有一个属性设置,在某些环境中,它可以覆盖特定的属性.例如,dev的默认JDBC属性是:

  • db.driverClassName = com.mysql.jdbc.Driver
  • = db.url配置参数JDBC:MySQL的://本地主机:3306/ourdb
  • db.username =根
  • db.password =

问题是我们的一些开发人员希望在数据库上拥有不同的用户名/密码,甚至可能是非本地托管的数据库.我们的rabbitMQ配置也是如此,它目前使用类似的localhost,guest/guest设置.能够在每个开发人员的基础上覆盖此配置的某些元素的属性将允许我们移动大部分基础架构/安装要求,以便从本地计算机和专用服务器上构建软件.

我已经设置了一个简单的项目来围绕实现我想要的配置,这是我第一次进入spring属性配置的世界,因为到目前为止,属性加载和管理是通过一些自定义完成的码.这是我的设置:

class Main_PropertyTest {
    public static void main(String[] args) {
        String environment = System.getenv("APPLICATION_ENVIRONMENT"); // Environment, for example: "dev"
        String subEnvironment = System.getenv("APPLICATION_SUB_ENVIRONMENT"); // Developer name, for example: "joe.bloggs"
        System.setProperty("spring.profiles.active", environment);
        System.setProperty("spring.profiles.sub", subEnvironment);

        try(AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PropertyTestConfiguration.class)) {
            Main_PropertyTest main = context.getBean(Main_PropertyTest.class);
            main.printProperty();
        }
    }

    private final String property;

    public Main_PropertyTest(String property) {
        this.property = property;
    }

    public void printProperty() {
        System.out.println("And the property is: '" + property …
Run Code Online (Sandbox Code Playgroud)

java spring properties spring-java-config

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

springSecurityFilterChain nullPointer Exception

当我尝试运行项目时,Tomcat返回一个异常.

有人可以帮忙解决这个问题吗?配置类:https://github.com/intrade/inventory/blob/master/src/main/java/com/springapp/mvc/InitApp/SecurityConfig.java

堆栈跟踪:

Jan 24, 2014 4:09:40 PM org.apache.catalina.core.ApplicationContext log
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.servlet.Filter org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain() throws java.lang.Exception] threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:581)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1029)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:925)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:285)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
    at …
Run Code Online (Sandbox Code Playgroud)

java spring-security spring-java-config

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

春天4 javaconfig为jasypt和配置文件

如何在Spring 4中将2 xml以下的配置转换为java Config

1)jasypt

<encryption:encryptor-config id="eConf" password-env-name="APP_ENCRYPTION_PASSWORD" algorithm="PBEWithMD5AndDES" />

<encryption:string-encryptor id="stringEnc" config-bean="eConf" />
Run Code Online (Sandbox Code Playgroud)

encryption:encryptor-config加密的第一部分()可以像这样转换:

@Bean
public EnvironmentStringPBEConfig environmentVariablesConfiguration() {

    EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
    config.setAlgorithm("PBEWithMD5AndDES");
    config.setPasswordEnvName("APP_ENCRYPTION_PASSWORD");
}
Run Code Online (Sandbox Code Playgroud)

但是,如何转换加密:string-encryptor部分.

2)简介

    <beans profile="dev">
        <util:properties id="myProps" location="classpath:dev.properties" />
    </beans>

    <beans profile="prod">
        <util:properties id="myProps" location="classpath:prod.properties" />
    </beans>
Run Code Online (Sandbox Code Playgroud)

@PropertySource("classpath:prod.properties")用于util:properties,但如何在PropertySource注释中提到配置文件?

spring jasypt spring-java-config

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

BeanPostProcessor 未使用 Spring Java Config 调用 @Bean 方法

我正在尝试在我的 Spring Java 配置中添加一个 BeanPostProcessor。它似乎有效但仅适用于通过组件扫描创建的 bean (@Configuration, @RestController, ..)

我在 Java 配置中创建的 Bean 不是。

例如

@Configuration
public class MyConfiguration
{
  @Bean
  public MyBean myBean()
  {
    return new MyBean();
  }


  @Bean
  public static MyBPP myBeanPostProcessor()
  {
    return new MyBPP();
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我确实将 BeanPostProcessor 的方法声明为静态(参见http://forum.spring.io/forum/spring-projects/container/123899-beanpostprocessor-with-bean-annotation-not-working)。

因此创建了一个 MyBean 实例,但 BeanPostProcessor 永远不会处理它。

java spring spring-boot spring-java-config

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

LDAPTemplate.ignorePartialResultException的Spring Java配置

应用程序学问题很长,但总之我想知道如何org.springframework.ldap.core.LdapTemplate#ignorePartialResultException使用Spring Java Config 设置标志。

长期存在的问题是...

我想使用我们公司的Active Directory进行身份验证(这意味着用户/密码检查),然后再进行授权(因此他们有权使用哪些角色)。

我采用了春季ldap指南,并进行了更改以连接到我们公司的Active Directory,而不是使用指南的LDIF文件。通过调试,我知道程序连接到Active Directory并正确验证了用户身份,但是在检索权限时,出现以下异常:

Unprocessed Continuation Reference(s); nested exception is javax.naming.PartialResultException
Run Code Online (Sandbox Code Playgroud)

从谷歌搜索中,我看到这是一个常见的LDAP / ActiveDirectory问题,我需要设置标志以忽略引用。我遵循了这个SO问题中的示例。但是,我仍然遇到异常,通过调试,我可以发现在为用户搜索角色时,以下方法中发生了错误。

org.springframework.ldap.core.LdapTemplate#search(org.springframework.ldap.core.SearchExecutor, org.springframework.ldap.core.NameClassPairCallbackHandler, org.springframework.ldap.core.DirContextProcessor) 
Run Code Online (Sandbox Code Playgroud)

作为参考,我的WebSecurityConfig文件:

Unprocessed Continuation Reference(s); nested exception is javax.naming.PartialResultException
Run Code Online (Sandbox Code Playgroud)

active-directory spring-ldap spring-security-ldap spring-java-config

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

使用基于Spring Java的配置注入bean依赖项

我正在尝试了解基于Spring Java的配置.通常我可能有一个包含以下内容的XML配置:

<context:property-placeholder location="jdbc.properties"/>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
  p:driverClassName="${jdbc.driverClassName}"
  p:ur="${jdbc.url}"
  p:username="${jdbc.username}"
  p:password="${jdbc.password}"/>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
        p:dataSource-ref="dataSource" />
Run Code Online (Sandbox Code Playgroud)

我努力生成等效但使用基于Spring Java的配置已经停滞不前.我不确定在尝试将我的dataSource注入jdbcTemplate时该怎么做:

@PropertySource("classpath:jdbc.properties")
@Configuration
public class Config {

  @Bean
  public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
  }

  @Bean(name = "dataSource")
  public DataSource dataSource(
    @Value("${jdbc.driverClassName}") final String driverClassName,
    @Value("${jdbc.url}") final String url,
    @Value("${jdbc.username}") final String username,
    @Value("${jdbc.password}") final String password) {
    BasicDataSource datasource = new BasicDataSource();
    datasource.setDriverClassName(driverClassName);
    datasource.setUrl(url);
    datasource.setUsername(username);
    datasource.setPassword(password);
    return datasource;
  }

  @Bean(name = "jdbcTemplate")
  public JdbcTemplate jdbcTemplate() {
    return new JdbcTemplate( …
Run Code Online (Sandbox Code Playgroud)

java spring dependency-injection inversion-of-control spring-java-config

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

Apache Shiro JdbcRealm与JavaConfig和Spring Boot

我正在尝试配置我的Spring Boot应用程序以使用Apache Shiro作为其安全框架.我有一切使用PropertiesRealm,现在我正在尝试使用JdbcRealm和Spring Boot的内置H2数据库.这是我在pom.xml中的依赖项:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我的schema.sql:

create table if not exists users (
  username varchar(256),
  password varchar(256),
  enabled boolean
);

create table if not exists user_roles (
  username varchar(256),
  role_name varchar(256)
);
Run Code Online (Sandbox Code Playgroud)

我的data.sql:

insert into users (username, password, enabled) values ('user', '04f8996da763b7a969b1028ee3007569eaf3a635486ddab211d512c85b9df8fb', true);

insert into user_roles (username, role_name) values ('user', …
Run Code Online (Sandbox Code Playgroud)

java shiro spring-boot spring-java-config

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

Spring中FilterType.ANNOTATION的字符串模式

我正在使用基于Java的配置类来开发Spring MVC应用程序.我想为我的Controller类添加一个过滤器,@ComponentScan如下所示:

@Configuration
@ComponentScan(basePackages = { "org.fandom.configclass" }, 
excludeFilters = { @ComponentScan.Filter (type = FilterType.ANNOTATION, 
pattern = "org.springframework.stereotype.Controller")})
public class Config {         
   // some stuff
}
Run Code Online (Sandbox Code Playgroud)

但似乎没有工作,并给我一个例外说

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [org.fandom.configclass.Config]; nested exception is java.lang.IllegalArgumentException: Filter type not supported with String pattern: ANNOTATION
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:179)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:306)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:239)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:254)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:94)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:606)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:462)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5014)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5528)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc spring-java-config

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

Spring Batch - 如何防止批处理在DB中存储事务

首先是问题陈述:我在DEV环境中使用Spring-Batch很好.当我将代码移动到生产环境时,我遇到了问题.在我的DEV环境中,Spring-Batch能够在我们的DB2数据库服务器中创建它的事务数据表而没有问题.当我们去PROD时这不是一个选项,因为这是一个只读工作.

尝试解决方案:

搜索Stack Overflow我发现这个帖子: Spring-Batch没有将元数据保存到数据库?

这听起来很完美,所以我补充道

@Bean
public ResourcelessTransactionManager transactionManager() {
    return new ResourcelessTransactionManager();
}

@Bean
public JobRepository jobRepository(ResourcelessTransactionManager transactionManager) throws Exception {
    MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(transactionManager);
    mapJobRepositoryFactoryBean.setTransactionManager(transactionManager);

    return mapJobRepositoryFactoryBean.getObject();
}
Run Code Online (Sandbox Code Playgroud)

我还通过调用.reporitory(jobRepository)将它添加到我的Job中.

但我明白了

Caused by: java.lang.NullPointerException: null
    at       org.springframework.batch.core.repository.dao.MapJobExecutionDao.synchronizeStatus(MapJobExecutionDao.java:158) ~[spring-batch-core-3.0.6.RELEASE.jar:3.0.6.RELEASE]
Run Code Online (Sandbox Code Playgroud)

所以我不知道该怎么做.我是春天的新手,所以我一边教我自己.我对其他解决方案持开放态度,例如内存数据库,但我也无法让它们工作.我不需要在运行之间保存任何状态或会话信息,但我运行的数据库查询将返回大约一百万行左右,因此我需要以块的形式获取.

任何建议或帮助将不胜感激.

spring-batch spring-java-config

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

Spring Batch-循环读取器/处理器/写入器步骤

回答

根据可接受的答案代码,对该代码进行以下调整对我有用:

// helper method to create a split flow out of a List of steps
private static Flow createParallelFlow(List<Step> steps) {
    SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
    taskExecutor.setConcurrencyLimit(steps.size());         

    Flow[] flows = new Flow[steps.size()];
    for (int i = 0; i < steps.size(); i++) {
        flows[i] = new FlowBuilder<SimpleFlow>(steps.get(i).getName()).start(steps.get(i)).build();
    }           

    return new FlowBuilder<SimpleFlow>("parallelStepsFlow")
        .split(taskExecutor)                
        .add(flows)
        .build();
}
Run Code Online (Sandbox Code Playgroud)

编辑

我已经将问题更新为可以正确循环的版本,但是随着应用程序的扩展,能够并行处理很重要,而且我仍然不知道如何在运行时动态地使用javaconfig来实现这一点...

改进的问题:如何在运行时针对5种不同情况动态创建读取器-处理器-写入器(5个查询意味着按现在配置的5个循环)?

我的LoopDecider看起来像这样:

public class LoopDecider implements JobExecutionDecider {

    private static final Logger LOG = LoggerFactory.getLogger(LoopDecider.class);
    private static final String …
Run Code Online (Sandbox Code Playgroud)

java spring spring-batch spring-java-config

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