我正在使用Hibernate Validator 4.2.0.Final,我正在寻找在我的错误消息中包含类字段名称的最简单方法.
我找到的是以下线程使用自定义ResourceBundle和Hibernate Validator.根据这个,我应该为每个约束注释创建我的自定义注释,为每个约束注释添加一个属性.
有没有更清洁的方法来实现这一目标?
以下代码:
@Size(max = 5)
private String myField;
Run Code Online (Sandbox Code Playgroud)
产生默认错误:大小必须介于0和5之间.
我希望它是:myField大小必须介于0和5之间.
提前致谢.
我有一个具有两个验证注释的字段
@NotEmpty
@Length(min=3,max=100)
String firstName;
Run Code Online (Sandbox Code Playgroud)
我只是想知道hibernate如何指定首先执行验证注释的顺序,以及是否可以自定义?
我问的原因是,如果我将该字段留空,有时显示的第一个验证消息是非空的,有时如果我将其留空,则获得长度注释的验证消息.
提前致谢.
我@Valid对JSR-303 的注释有问题.在注释工作正常,正常列表或及组合,但我试图验证的地图,其中包含列表,即
@Valid
HashMap<String, ArrayList<Object1>> map;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Object1不验证类的实例.是否有一种方便的方法来递归执行此操作,而无需迭代每个对象并手动验证它?
我正在使用此答案中HibernateValidator指定的表格上的两个字段"password"和"confirmPassword"进行验证.以下是约束描述符(验证器接口).
package constraintdescriptor;
import constraintvalidator.FieldMatchValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target;
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@Documented
public @interface FieldMatch
{
String message() default "{constraintdescriptor.fieldmatch}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
/**
* @return The first field
*/
String first();
/**
* @return The second field
*/
String second();
/**
* Defines several <code>@FieldMatch</code> annotations on the …Run Code Online (Sandbox Code Playgroud) 下面是我遇到问题的映射方法,无论我传递给它的值是什么,验证都返回"通过验证".
@RequestMapping(value = "test", method = RequestMethod.POST)
@ResponseBody
public String getTest(@RequestBody @Valid @Max(32) long longValue, BindingResult result) {
if (result.hasErrors()) {
return "failed validation";
} else {
return "passed validation";
}
}
Run Code Online (Sandbox Code Playgroud)
我知道@Max适用于我的应用程序,因为我将它用于验证自定义对象,这些对象将大量数据返回给控制器.在这种情况下我只调用@Valid和方法参数中对象的验证类型,它才会运行验证.
hibernate-validator不允许这样做吗?
我希望不必定义一个只包含长值的对象,以便我可以对其进行验证.
我不知道你是否能够从标题中弄清楚我想要做什么,所以我会尝试用例子来解释
让我们假设我已经创建了自己的注释 @VerifySomething
我已经为该注释创建了测试类,以确保它的工作原理.
现在让我们假设我有一个带有注释的SomeClass字段的类something@VerifySomething
class SomeClass {
@VerifySomething
String something;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都那么好,但是现在我想test class为我创建SomeClass但是我没有看到任何关于验证所有测试用例的内容,因为我已经检查@VerifySomething过它在应用于测试该注释的类中应该工作,但是我需要确保该字段实际上有一个@VerifySomething注释没有复制粘贴所有这些测试用例.
所以我的问题是,有没有办法检查某个字段是否有一个或多个必需的注释,而不编写我已经在注释测试类中编写的测试用例,以确保它按预期工作.
我在一些字段上有一个带有hibernate验证注释的类(例如@NotNull和@Size(min = 4, max = 50)等...)
public class MyClass {
Long id;
@NotEmpty
@Size(min = 4, max = 50)
String machineName;
@NotEmpty
@Size(min = 4, max = 50)
String humanName;
// Getters, setters, etc…
}
Run Code Online (Sandbox Code Playgroud)
我还有一个充当JSON API的自定义控制器,以及一个在调用API方法时创建MyClass对象的JSON反序列化器.在我的自定义控制器中,我有一个方法来创建该类型的新对象:
@RequestMapping(method = RequestMethod.POST)
public long createMyObject(@RequestBody @Valid MyClass newObj) {
// Create the object in the database
return newObj.getId();
}
Run Code Online (Sandbox Code Playgroud)
和另一种更新现有对象的方法
@RequestMapping(method = RequestMethod.PUT)
public void updateMyObject(@RequestBody MyClass updatedObj) {
MyClass existingObj = // Get existing obj from DB …Run Code Online (Sandbox Code Playgroud) 在我的控制器中,我有String参数,包含一些id,不应该是空字符串的null.我想知道,有没有办法检查它是不是@RequestMapping params中的空字符串?我试图在某些方面解决它
@RequestMapping(value = someURL, params = {"id"})
public SomeResponse doSomething(@RequestParam(required = true) String id)
@RequestMapping(value = someURL, params = {"!id="})
public SomeResponse doSomething(@RequestParam(required = true) String id)
@RequestMapping(value = someURL, params = {"!id=\"\""})
public SomeResponse doSomething(@RequestParam(required = true) String id)
Run Code Online (Sandbox Code Playgroud)
没有成功.据我了解,双方params = {"id"}并@RequestParam(required = true)只能检查参数id呈现在请求(!= NULL).
我很可能必须使用控制器boby中的代码检查它,例如
if (id == null || id.isEmpty()) {
return someErrorResponse;
}
Run Code Online (Sandbox Code Playgroud)
但如果我错了,请纠正我.提前致谢.
PS我的应用程序在Apache Tomcat 7.0.62容器中的Java 1.7 SE上运行
java spring spring-mvc hibernate-validator spring-annotations
我在堆栈溢出中找到了三个条目:
javax.validation.ValidationException:无法找到默认提供程序
javax.validation.ValidationException:无法找到默认提供程序
并且所有三个人都说将hibernate验证器添加到类路径中.当我这样做并仍然得到相同的错误时我该怎么办?
1301 [main] ERROR org.springframework.web.servlet.DispatcherServlet - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/db.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable to get the default Bean Validation factory
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:631)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:588)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:645)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:508)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:449)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:133)
at javax.servlet.GenericServlet.init(GenericServlet.java:241) …Run Code Online (Sandbox Code Playgroud) 我现在很困惑.我知道Hibernate Validator 6是Bean Validation 2.0规范的参考实现.它支持分组,错误消息的国际化,自定义方法验证等.问题是Spring 5是否支持这些功能,还是我只剩下Hibernate Validator 6?
为什么我应该使用Hibernate Validator和我的Sprig Boot项目而不是提供的Spring Validation.我的公司需要使用任何第三方库的理由.
所有在线参考示例都建议使用Hibernate Validator,并且在Spring验证中没有发现任何内容,请建议或指向其他链接.