外部に定義されたPropertyファイルをロードして値チェックとか
さいきん、ちょこちょこSpringを調べててなにかいい方法ないかなぁと思って調べてました。
springのproperty-placeholderとJSR303な感じでやってみました。
全体的なプロジェクトのファイルはこんなん。おまけでJSR330も使ってみました。
applicationContext.xml
property-placeholderを使ってtest.propertiesを読み込むようにしてる。あとはcomponent-scanで自動的にコンポーネントを見つけてくれるように。
<?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"> <context:component-scan base-package="org.yamkazu.spring" /> <context:property-placeholder location="classpath:test.properties" /> </beans>
test.properties
count=11
TestConfig
続いてtest.propertiesの値を展開するクラス。@Valueを使ってtest.propertiesのキーをマッピングしています。あとはJSR303のアノテーションを使って条件を設定。
package org.yamkazu.spring.config; import javax.inject.Named; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import org.springframework.beans.factory.annotation.Value; @Named public class TestConfig { @Min(5) @Max(10) @Value("${count}") private String count; public Integer getCount() { return Integer.valueOf(count); } }
使う
準備はここまで、使うときはこんなんです。
package org.yamkazu.spring.config; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import java.util.Set; import javax.inject.Inject; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @ContextConfiguration(locations = {"/applicationContext.xml"}) @RunWith(SpringJUnit4ClassRunner.class) public class TestConfigTest { @Inject TestConfig testBean; static Validator validator; @BeforeClass public static void beforeClass() { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); validator = factory.getValidator(); } @Test public void test01() throws Exception { assertThat(testBean.getCount(), is(11)); Set<ConstraintViolation<TestConfig>> validate = validator.validate(testBean); assertThat(validate.size(), is(1)); assertThat(validate.iterator().next().getMessage(), is("must be less than or equal to 10")); } }
pom.xml
いちおう貼りつけておきます。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.yamkazu</groupId> <artifactId>spring-autoloadproperites</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-autoloadproperites</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <org.springframework.version>3.0.1.RELEASE</org.springframework.version> <org.slf4j.version>1.5.10</org.slf4j.version> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>JBoss Repo</id> <url>http://repository.jboss.com/maven2</url> </repository> </repositories> <dependencies> <!-- SPRING --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- JSR330 --> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <!-- JSR303 --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.0.2.GA</version> </dependency> <!-- LOGGING --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${org.slf4j.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${org.slf4j.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> </exclusion> <exclusion> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </exclusion> <exclusion> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> </exclusion> <exclusion> <groupId>com.sun.jmx</groupId> <artifactId>jmxri</artifactId> </exclusion> </exclusions> <scope>runtime</scope> </dependency> <!-- TESTING --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${org.springframework.version}</version> <scope>test</scope> </dependency> </dependencies> </project>