<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Marshal&#039;s Blog &#187; hibernate validator</title>
	<atom:link href="http://marshal.easymorse.com/archives/tag/hibernate-validator/feed" rel="self" type="application/rss+xml" />
	<link>http://marshal.easymorse.com</link>
	<description>It&#039;s swap of marshal&#039;s memory.</description>
	<lastBuildDate>Mon, 30 Jan 2012 07:03:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>spring 3.0中的校验</title>
		<link>http://marshal.easymorse.com/archives/2221?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spring-3-0%25e4%25b8%25ad%25e7%259a%2584%25e6%25a0%25a1%25e9%25aa%258c</link>
		<comments>http://marshal.easymorse.com/archives/2221#comments</comments>
		<pubDate>Fri, 22 Jan 2010 05:59:49 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[hibernate validator]]></category>
		<category><![CDATA[jsr303]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring validation]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/2221</guid>
		<description><![CDATA[在weapon项目中，表单在客户端实现了校验，简单而有效。但是还要提防可能出现的客户端校验失效问题，在这种情况下也要做到服务器端不会录入问题数据。这就需要服务器端校验。 spring 3.0引入了jsr 303的java校验工具框架。 需要导入的类库： &#60;dependency&#62; &#160;&#160;&#160; &#60;groupId&#62;org.hibernate&#60;/groupId&#62; &#160;&#160;&#160; &#60;artifactId&#62;hibernate-validator&#60;/artifactId&#62; &#160;&#160;&#160; &#60;version&#62;4.0.0.GA&#60;/version&#62; &#60;/dependency&#62; &#60;dependency&#62; &#160;&#160;&#160; &#60;groupId&#62;org.slf4j&#60;/groupId&#62; &#160;&#160;&#160; &#60;artifactId&#62;slf4j-log4j12&#60;/artifactId&#62; &#160;&#160;&#160; &#60;version&#62;1.5.6&#60;/version&#62; &#60;/dependency&#62; &#160; spring的配置： &#60;bean &#160;&#160;&#160; class=&#34;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter&#34;&#62; &#160;&#160;&#160; &#60;property name=&#34;webBindingInitializer&#34;&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;bean &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; class=&#34;org.springframework.web.bind.support.ConfigurableWebBindingInitializer&#34;&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;property name=&#34;validator&#34; ref=&#34;validator&#34; /&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;/bean&#62; &#160;&#160;&#160; &#60;/property&#62; &#60;/bean&#62; &#60;bean id=&#34;validator&#34; &#160;&#160;&#160; class=&#34;org.springframework.validation.beanvalidation.LocalValidatorFactoryBean&#34; /&#62; &#160; 然后写点儿代码即可。首先是domain对象，就是javabean，要校验的名词对象，需要这样写： @NotNull @NotEmpty private String name; [...]]]></description>
			<content:encoded><![CDATA[<p>在weapon项目中，表单在客户端实现了校验，简单而有效。但是还要提防可能出现的客户端校验失效问题，在这种情况下也要做到服务器端不会录入问题数据。这就需要服务器端校验。</p>
<p>spring 3.0引入了jsr 303的java校验工具框架。</p>
<p>需要导入的类库：</p>
<blockquote><p>&lt;dependency&gt;      <br />&#160;&#160;&#160; &lt;groupId&gt;org.hibernate&lt;/groupId&gt;       <br />&#160;&#160;&#160; &lt;artifactId&gt;hibernate-validator&lt;/artifactId&gt;       <br />&#160;&#160;&#160; &lt;version&gt;4.0.0.GA&lt;/version&gt;       <br />&lt;/dependency&gt;       <br />&lt;dependency&gt;       <br />&#160;&#160;&#160; &lt;groupId&gt;org.slf4j&lt;/groupId&gt;       <br />&#160;&#160;&#160; &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;       <br />&#160;&#160;&#160; &lt;version&gt;1.5.6&lt;/version&gt;       <br />&lt;/dependency&gt;</p>
<p>&#160;</p>
</blockquote>
<p> <span id="more-2221"></span>
<p>spring的配置：</p>
<blockquote><p>&lt;bean      <br />&#160;&#160;&#160; class=&quot;org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter&quot;&gt;       <br />&#160;&#160;&#160; &lt;property name=&quot;webBindingInitializer&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;bean       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; class=&quot;org.springframework.web.bind.support.ConfigurableWebBindingInitializer&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;validator&quot; ref=&quot;validator&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/bean&gt;       <br />&#160;&#160;&#160; &lt;/property&gt;       <br />&lt;/bean&gt; </p>
<p>&lt;bean id=&quot;validator&quot;      <br />&#160;&#160;&#160; class=&quot;org.springframework.validation.beanvalidation.LocalValidatorFactoryBean&quot; /&gt;</p>
<p>&#160;</p>
</blockquote>
<p>然后写点儿代码即可。首先是domain对象，就是javabean，要校验的名词对象，需要这样写：</p>
<blockquote><p>@NotNull      <br />@NotEmpty       <br />private String name;</p>
<p>&#160;</p>
</blockquote>
<p>表示不能为空，也不能为空字串。这里NotEmpty不是jsr303标准的注解，是hibernate扩展的。</p>
<p>使用校验：</p>
<blockquote><p>@RequestMapping(value = &quot;/save.json&quot;, method = RequestMethod.POST)      <br />public String save(@Valid Weapon weapon, BindingResult results) {       <br />&#160;&#160;&#160; if (results.hasErrors()) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; throw new RuntimeException(results.getAllErrors().toString());       <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; if (weapon.getId() == null || weapon.getId().isEmpty()) {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; create(weapon);       <br />&#160;&#160;&#160; } else {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; update(weapon);       <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; return &quot;saved&quot;;      <br />}</p>
</blockquote>
<p>在这里通过Valid注解，标注需要校验的变量。后面的BindingResult，是存储错误信息的对象。这里做的很简单，如果校验有错误，将直接抛出runtime异常。因为正常情况下都应该通过客户端的校验机制处理了。</p>
<p>这里将客户端校验代码屏蔽，测试到的结果是返回了异常：</p>
<blockquote><p>java.lang.RuntimeException: [Field error in object 'weapon' on field 'name': rejected value []; codes [NotEmpty.weapon.name,NotEmpty.name,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [weapon.name,name]; arguments []; default message [name],{org.hibernate.validator.constraints.NotEmpty.message},[Ljava.lang.Class;@1d6ced0,[Ljava.lang.Class;@1a3ece5]; default message [may not be empty]]      <br />&#160;&#160;&#160; at com.easymorse.weapons.server.WeaponService.save(WeaponService.java:74)</p>
</blockquote>
<p>另外，还可以在注解中使用提示信息，比如：</p>
<blockquote><p><font style="background-color: #ffffff">@NotEmpty(message=”请输入名称”)</font></p>
</blockquote>
<p>还有，校验注释有：</p>
<blockquote><p><a></a>
<p>@Pattern(regex=, flag=)</p>
</p>
<p>   <font style="background-color: #ffffff"></font></p></blockquote>
<p>这是标准的，可以写正则表达式。</p>
<p>源代码：</p>
<blockquote><p><a title="http://easymorse.googlecode.com/svn/tags/Weapons-0.5.5" href="http://easymorse.googlecode.com/svn/tags/Weapons-0.5.5">http://easymorse.googlecode.com/svn/tags/Weapons-0.5.5</a></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/2221/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

