我的Bean验证在我的应用程序中运行良好.现在我想检查新用户是否选择了已经选择的用户名.
在actionlistener中,我有检查数据库的代码,但如果用户选择已存在的用户名,如何强制用户被发送回他们所在的页面?
我看到很多将bean标记为实体bean(@Entity)和命名bean(CDI)的示例,以避免创建2个类(托管bean和实体bean)以及使用Bean Validation以便可以执行验证在客户端和服务器上.
那么我是否应该使用单个类,是否存在任何问题,或者我是否应该使用托管bean中的数据创建托管bean或服务层创建实体bean?
我正在使用此答案中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) 在关系中声明@OneToOne和@NotNull双方是否有效,例如:
class ChangeEntry
{
@OneToOne(cascade=CascadeType.ALL)
@NotNull
ChangeEntryDetails changeEntryDetails;
public void addDetails(ChangeEntryDetails details) {
this.changeEntryDetails = details;
details.setChangeEntry(this);
}
}
class ChangeEntryDetails
{
@OneToOne(cascase=CascadeType.ALL)
@NotNull
ChangeEntry changeEntry;
public void setChangeEntry(ChangeEntry changeEntry)
{
this.changeEntry = changeEntry;
}
}
Run Code Online (Sandbox Code Playgroud)
我找不到任何说这是无效的东西,但似乎在持久性过程中至少有一方必须违反.(例如,如果首先编写changeEntry,则changeEntryDetails将暂时为null).
尝试这个时,我看到一个异常抛出not-null property references a null or transient value.
如果可能的话,我想避免放松约束,因为双方都必须在场.
我正在开发一个使用JSR 303验证的Spring后端的GWT应用程序.应用程序可以脱机并使用浏览器HTML5/Gears数据库.
实现客户端验证的最佳方法是什么?到目前为止,我已经找到了gwt-validation框架(http://code.google.com/p/gwt-validation/),但它似乎已不再有效.
谢谢!
更新:
有一个新的GWT官方项目来支持JSR 303 Bean Validation(链接在这里).IMO这是项目成熟后的方法.
我在Netbeans 7中创建了一个EJB Session facade来保存我的实体.我的保险和RatePlan类之间有很多映射.
public class Insurance{
@ManyToOne(optional=false)
@JoinColumn(name="PLAN_ID")
private RatePlan plan;
}
public class RatePlan{
@OneToMany(mappedBy="plan")
private Set<Insurance> insuranceItems;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用EJB会话Bean保存数据库时,遇到以下错误.
引起:javax.validation.ConstraintViolationException:在回调事件上执行自动Bean验证时违反了Bean验证约束:'prePersist'.有关详细信息,请参阅嵌入式ConstraintViolations.
我所做的是在我的Persistence.xml文件中关闭我的Bean验证.我想知道发生了什么Bean验证错误,但我不知道如何或在哪里找到它或如何配置和捕获它.
我的EJB外观是一个像tis这样的简单类.
public class InsuranceFacade{
public void saveInsurance(Insurance insurance){
em.persist(insurance);
}
}
Run Code Online (Sandbox Code Playgroud)
任何提示?
在使用Spring MVC构建RESTful Web服务时,我觉得在尝试组合Jackson JSON反序列化和JSR-303 bean验证时遇到了棘手的情况.
关于JSR-303验证的一个好处是,可以返回与目标对象关联的所有验证错误,而不是仅在第一个约束违规时失败(尽管如果要使用它,则存在失败快速模式).
想象一下你有一个JSON有效载荷的场景,例如:
{
"firstname": "Joe",
"surname": "Bloggs",
"age": 25
}
Run Code Online (Sandbox Code Playgroud)
然后你有想要映射到的对象:
public class Person {
@NotNull
private String firstname;
@NotNull
private String surname;
@Min(value = 0)
private int age;
...
}
Run Code Online (Sandbox Code Playgroud)
我对此设置的问题是,如果客户端发送一个字符串作为"年龄"的值,整个杰克逊反序列化过程将失败而不能专门针对它失败的原因(即我们永远不会得到验证) ).想象一下,这个有效载荷:
{
"age": "invalid"
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想要返回的是"错误"响应,例如:
{
"errors" : [
"error": {
"field": "firstname",
"message": "Must not be null",
},
"error": {
"field": "surname",
"message": "Must not be null",
},
"error": {
"field": "age",
"message": "Must be numeric value greater than or equal …Run Code Online (Sandbox Code Playgroud) 如何使用@SizeMySQL DECIMAL(x,y)列的注释?
我正在使用BigDecimal,但是当我尝试包含@Size max它时它不起作用.这是我的代码:
@Size(max = 7,2)
@Column(name = "weight")
private BigDecimal weight;
Run Code Online (Sandbox Code Playgroud) 我有一个包含User类的Spring Boot应用程序 - 所有字段都有标准的JSR-303注释(@ NotNull,@ Size等),并且验证工作正常.
但是,当我向User添加自定义验证时,我无法将依赖注入到自定义验证器中:
@Component
public class UniqueUsernameValidator implements
ConstraintValidator<UniqueUsername, String> {
@Autowired
private UserRepository userRepository;
@Override
public boolean isValid(String username, ConstraintValidatorContext context) {
// implements logic
}
Run Code Online (Sandbox Code Playgroud)
@UniqueUsername注释声明为:
@Documented
@Retention(RUNTIME)
@Target({FIELD, ANNOTATION_TYPE, PARAMETER})
@Constraint(validatedBy = UniqueUsernameValidator.class)
@interface UniqueUsername {
String message() default "{com.domain.user.nonUniqueUsername}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
Run Code Online (Sandbox Code Playgroud)
带注释的字段:
@NotBlank
@Size(min = 2, max = 30)
@UniqueUsername
private String username;
Run Code Online (Sandbox Code Playgroud)
验证器用法:
@Service
public final class UserService {
private …Run Code Online (Sandbox Code Playgroud) 这是我的FileStorageProperties课:
@Data
@ConfigurationProperties(prefix = "file")
public class FileStorageProperties {
private String uploadDir;
}
Run Code Online (Sandbox Code Playgroud)
这让我说:未通过 @enableconfigurationproperties 注册或标记为 spring 组件。
这是我的FileStorageService:
@Service
public class FileStorageService {
private final Path fileStorageLocation;
@Autowired
public FileStorageService(FileStorageProperties fileStorageProperties) {
this.fileStorageLocation = Paths.get(fileStorageProperties.getUploadDir())
.toAbsolutePath().normalize();
try {
Files.createDirectories(this.fileStorageLocation);
} catch (Exception ex) {
throw new FileStorageException("Could not create the directory where the uploaded files will be stored.", ex);
}
}
public String storeFile(MultipartFile file) {
// Normalize file name
String fileName = …Run Code Online (Sandbox Code Playgroud) java spring bean-validation spring-boot spring-restcontroller
bean-validation ×10
java ×4
jpa ×3
spring ×3
spring-mvc ×2
validation ×2
entity ×1
gwt ×1
hibernate ×1
jackson ×1
java-ee ×1
jsf ×1
jsf-2 ×1
json ×1
jsp ×1
managed-bean ×1
mysql ×1
orm ×1
spring-boot ×1