Skip to content

Commit 85ba6d5

Browse files
author
Maciej Walkowiak
committed
DATAMONGO-36 - added option in Mongo XML namespace for enabling validation
1 parent 5f3c1db commit 85ba6d5

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoNamespaceHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,6 @@ public void init() {
3737
registerBeanDefinitionParser("mongo", new MongoParser());
3838
registerBeanDefinitionParser("db-factory", new MongoDbFactoryParser());
3939
registerBeanDefinitionParser("jmx", new MongoJmxParser());
40+
registerBeanDefinitionParser("validation-enabled", new MongoValidationParser());
4041
}
4142
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.springframework.data.mongodb.config;
2+
3+
import org.springframework.beans.factory.BeanDefinitionStoreException;
4+
import org.springframework.beans.factory.config.BeanDefinition;
5+
import org.springframework.beans.factory.config.RuntimeBeanReference;
6+
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
7+
import org.springframework.beans.factory.support.AbstractBeanDefinition;
8+
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
9+
import org.springframework.beans.factory.support.RootBeanDefinition;
10+
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
11+
import org.springframework.beans.factory.xml.ParserContext;
12+
import org.springframework.data.mongodb.core.mapping.event.BeforeSaveValidator;
13+
import org.springframework.scheduling.config.AnnotationDrivenBeanDefinitionParser;
14+
import org.springframework.util.ClassUtils;
15+
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
16+
import org.w3c.dom.Element;
17+
18+
public class MongoValidationParser extends AbstractBeanDefinitionParser {
19+
private static final boolean jsr303Present = ClassUtils.isPresent("javax.validation.Validator", AnnotationDrivenBeanDefinitionParser.class.getClassLoader());
20+
21+
@Override
22+
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) throws BeanDefinitionStoreException {
23+
return "beforeSaveValidator";
24+
}
25+
26+
@Override
27+
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
28+
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition();
29+
30+
RuntimeBeanReference validator = getValidator(builder, parserContext);
31+
32+
if (validator == null) {
33+
return null;
34+
} else {
35+
builder.getRawBeanDefinition().setBeanClass(BeforeSaveValidator.class);
36+
builder.addPropertyValue("validator", validator);
37+
38+
return builder.getBeanDefinition();
39+
}
40+
}
41+
42+
private RuntimeBeanReference getValidator(Object source, ParserContext parserContext) {
43+
if (!jsr303Present) {
44+
return null;
45+
}
46+
47+
RootBeanDefinition validatorDef = new RootBeanDefinition(LocalValidatorFactoryBean.class);
48+
validatorDef.setSource(source);
49+
validatorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
50+
String validatorName = parserContext.getReaderContext().registerWithGeneratedName(validatorDef);
51+
parserContext.registerComponent(new BeanComponentDefinition(validatorDef, validatorName));
52+
53+
return new RuntimeBeanReference(validatorName);
54+
}
55+
}

spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-1.0.xsd

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@
1616
<xsd:import namespace="http://www.springframework.org/schema/data/repository"
1717
schemaLocation="http://www.springframework.org/schema/data/repository/spring-repository.xsd" />
1818

19+
<xsd:element name="validation-enabled">
20+
<xsd:annotation>
21+
<xsd:documentation source="org.springframework.data.mongodb.core.mapping.event.BeforeSaveValidator"><![CDATA[
22+
Creates instance of JSR-303 based validatior that its invoked on Mongo documents before they are saved.
23+
]]></xsd:documentation>
24+
</xsd:annotation>
25+
<xsd:simpleType>
26+
<xsd:restriction base="xsd:string" />
27+
</xsd:simpleType>
28+
</xsd:element>
29+
1930
<xsd:element name="mongo" type="mongoType">
2031
<xsd:annotation>
2132
<xsd:documentation source="org.springframework.data.mongodb.core.core.MongoFactoryBean"><![CDATA[

0 commit comments

Comments
 (0)