Skip to content

Commit cd120d9

Browse files
author
Maciej Walkowiak
committed
DATAMONGO-36 - added support for JSR-303 validation
1 parent 7502ac1 commit cd120d9

File tree

6 files changed

+174
-12
lines changed

6 files changed

+174
-12
lines changed

spring-data-mongodb/pom.xml

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<project xmlns="http://maven.apache.org/POM/4.0.0"
2-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
2+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
44
<modelVersion>4.0.0</modelVersion>
55
<parent>
66
<groupId>org.springframework.data</groupId>
@@ -42,9 +42,9 @@
4242
<version>${org.springframework.version.range}</version>
4343
<exclusions>
4444
<exclusion>
45-
<groupId>commons-logging</groupId>
46-
<artifactId>commons-logging</artifactId>
47-
</exclusion>
45+
<groupId>commons-logging</groupId>
46+
<artifactId>commons-logging</artifactId>
47+
</exclusion>
4848
</exclusions>
4949
</dependency>
5050
<dependency>
@@ -99,7 +99,7 @@
9999
<version>1.0</version>
100100
<optional>true</optional>
101101
</dependency>
102-
102+
103103
<!-- CDI -->
104104
<dependency>
105105
<groupId>javax.enterprise</groupId>
@@ -108,30 +108,45 @@
108108
<scope>provided</scope>
109109
<optional>true</optional>
110110
</dependency>
111-
111+
112112
<dependency>
113113
<groupId>javax.el</groupId>
114114
<artifactId>el-api</artifactId>
115115
<version>${cdi.version}</version>
116116
<scope>test</scope>
117117
</dependency>
118-
118+
119119
<dependency>
120120
<groupId>org.apache.openwebbeans.test</groupId>
121121
<artifactId>cditest-owb</artifactId>
122122
<version>${webbeans.version}</version>
123123
<scope>test</scope>
124124
</dependency>
125-
125+
126126
<dependency>
127127
<groupId>javax.servlet</groupId>
128128
<artifactId>servlet-api</artifactId>
129129
<version>2.5</version>
130130
<scope>test</scope>
131131
</dependency>
132132

133+
<!-- JSR 303 Validation -->
134+
<dependency>
135+
<groupId>javax.validation</groupId>
136+
<artifactId>validation-api</artifactId>
137+
<version>1.0.0.GA</version>
138+
<scope>compile</scope>
139+
</dependency>
140+
141+
<dependency>
142+
<groupId>org.hibernate</groupId>
143+
<artifactId>hibernate-validator</artifactId>
144+
<version>4.2.0.Final</version>
145+
<scope>test</scope>
146+
</dependency>
147+
133148
</dependencies>
134-
149+
135150
<build>
136151
<plugins>
137152
<plugin>
@@ -151,12 +166,13 @@
151166
</goals>
152167
<configuration>
153168
<outputDirectory>target/generated-test-sources</outputDirectory>
154-
<processor>org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor</processor>
169+
<processor>org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
170+
</processor>
155171
</configuration>
156172
</execution>
157173
</executions>
158174
</plugin>
159175
</plugins>
160176
</build>
161-
177+
162178
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.springframework.data.mongodb.core.mapping.event;
2+
3+
import com.mongodb.DBObject;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
7+
import javax.validation.ConstraintViolation;
8+
import javax.validation.ConstraintViolationException;
9+
import javax.validation.Validator;
10+
import java.util.Set;
11+
12+
/**
13+
* javax.validation dependant entities validator.
14+
* When it is registered as Spring component its automatically invoked before entities are saved in database.
15+
*
16+
* @author Maciej Walkowiak <walkowiak.maciej@yahoo.com>
17+
*/
18+
public class BeforeSaveValidator extends AbstractMongoEventListener {
19+
private static final Logger LOG = LoggerFactory.getLogger(BeforeSaveValidator.class);
20+
21+
private Validator validator;
22+
23+
@Override
24+
public void onBeforeSave(Object source, DBObject dbo) {
25+
LOG.debug("Validating object: {}", source);
26+
27+
Set violations = validator.validate(source);
28+
29+
if (violations.size() > 0) {
30+
LOG.info("During object: {} validation violations found: {}", source, violations);
31+
32+
throw new ConstraintViolationException((Set<ConstraintViolation<?>>) violations);
33+
}
34+
}
35+
36+
public void setValidator(Validator validator) {
37+
this.validator = validator;
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.springframework.data.mongodb.core.mapping.event;
2+
3+
import org.junit.Test;
4+
import org.junit.runner.RunWith;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.data.mongodb.core.MongoTemplate;
7+
import org.springframework.test.context.ContextConfiguration;
8+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
9+
10+
import javax.validation.ConstraintViolationException;
11+
12+
import static org.hamcrest.core.IsEqual.equalTo;
13+
import static org.junit.Assert.assertThat;
14+
import static org.junit.Assert.fail;
15+
16+
@RunWith(SpringJUnit4ClassRunner.class)
17+
@ContextConfiguration
18+
public class BeforeSaveValidatorTest {
19+
@Autowired
20+
private MongoTemplate mongoTemplate;
21+
22+
@Test
23+
public void shouldThrowConstraintViolationException() {
24+
//given
25+
User user = new User("john", 17);
26+
27+
try {
28+
//when
29+
mongoTemplate.save(user);
30+
31+
//then
32+
fail();
33+
} catch (ConstraintViolationException e) {
34+
assertThat(e.getConstraintViolations().size(), equalTo(2));
35+
}
36+
}
37+
38+
@Test
39+
public void shouldNotThrowAnyExceptions() {
40+
//given
41+
User user = new User("john smith", 18);
42+
43+
//when & then
44+
mongoTemplate.save(user);
45+
}
46+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.springframework.data.mongodb.core.mapping.event;
2+
3+
import javax.validation.constraints.Min;
4+
import javax.validation.constraints.Size;
5+
6+
/**
7+
* Class used to test JSR-303 validation @{link org.springframework.data.mongodb.core.mapping.event.BeforeSaveValidator}
8+
*
9+
* @author Maciej Walkowiak
10+
*/
11+
public class User {
12+
@Size(min = 10)
13+
private String name;
14+
15+
@Min(18)
16+
private Integer age;
17+
18+
public User(String name, Integer age) {
19+
this.name = name;
20+
this.age = age;
21+
}
22+
23+
public String getName() {
24+
return name;
25+
}
26+
27+
public Integer getAge() {
28+
return age;
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<beans xmlns="http://www.springframework.org/schema/beans"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
5+
xmlns:context="http://www.springframework.org/schema/context"
6+
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
7+
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
8+
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
9+
10+
<context:property-placeholder
11+
location="classpath:/org/springframework/data/mongodb/config/mongo.properties"/>
12+
13+
<mongo:mongo host="localhost" port="27017"/>
14+
15+
<bean id="mongoDbFactory" class="org.springframework.data.mongodb.core.SimpleMongoDbFactory">
16+
<constructor-arg name="mongo" ref="mongo"/>
17+
<constructor-arg name="databaseName" value="database"/>
18+
</bean>
19+
20+
<mongo:mapping-converter base-package="org.springframework.data.mongodb.core"/>
21+
22+
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
23+
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
24+
<constructor-arg name="mongoConverter" ref="mappingConverter"/>
25+
</bean>
26+
27+
<!-- enabling JSR-303 validation -->
28+
<mongo:validation-enabled/>
29+
30+
</beans>

spring-data-mongodb/template.mf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Import-Template:
1010
com.mongodb.*;version="0",
1111
com.mysema.query.*;version="[2.1.1, 3.0.0)";resolution:=optional,
1212
javax.annotation.processing.*;version="0",
13+
javax.validation.*;version="1.0.0.GA",
1314
javax.enterprise.*;version="${cdi.version:[=.=.=,+1.0.0)}";resolution:=optional,
1415
javax.tools.*;version="0",
1516
org.aopalliance.*;version="[1.0.0, 2.0.0)";resolution:=optional,

0 commit comments

Comments
 (0)