我使用的是JSF、Spring和Hibernate。Post模型具有Hibernate注释属性:
@Entity
@Table(name = "posts")
public class Post implements Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id")
private Long id;
private int version;
@Column(name = "title")
@NotEmpty(message = "Title should not be empty")
private String title;
... getters/setters
}当我试图在相应的bean中创建一个新的帖子时(忽略语法正确的漂亮面孔):
@Component
@ManagedBean
@RequestScoped
@URLMappings(mappings = {
@URLMapping(id = "posts", pattern = "/posts/", viewId = "/faces/posts/list.xhtml"),
@URLMapping(id = "new", pattern = "/posts/new", viewId = "/faces/posts/new.xhtml")
})
public class PostBean {
@Autowired
private PostService postService;
private List<Post> posts;
private Post post = new Post();
public List<Post> getPosts() {
return postService.findAll();
}
public Post getPost() {
return post;
}
public void setPost(Post post) {
this.post = post;
}
public String create(Post post) {
this.post = postService.save(post);
return "pretty:posts";
}
}PostRepository:
public interface PostRepository extends CrudRepository<Post, Long> {
public Post findByTitleIgnoreCase(String title);
}PostServiceImpl:
@Service("postService")
@Repository
@Transactional
public class PostServiceImpl implements PostService {
@Autowired
private PostRepository postRepository;
@Override
@Transactional(readOnly = true)
public List<Post> findAll() {
return Lists.newArrayList(postRepository.findAll());
}
@Override
@Transactional(readOnly = true)
public Post findById(Long id) {
return postRepository.findOne(id);
}
@Override
@Transactional(readOnly = true)
public Post findByTitleIgnoreCase(String title) {
return postRepository.findByTitleIgnoreCase(title);
}
@Override
@Transactional
public Post save(Post post) {
return postRepository.save(post);
}
@Override
public void destroy(Post post) {
postRepository.delete(post);
}
}我得到了javax.validation.ConstraintViolationException。奇怪的是,如果移除Hibernate注释,并将required="true"直接放入JSF页面中,放在标题文本字段旁边,它就可以工作。
<h:inputText id="title" value="#{postBean.post.title}" required="true"/>有什么想法吗?您可以在my github repo上找到该项目的源代码谢谢。
@NotNull是一个JSR303验证,@NotEmpty -是Hibernate的验证,这是唯一的区别。即使在更改为@NotNull之后,我仍然得到相同的错误。
更新顺便说一下,我删除了@ManagedBean注释,它不再需要了。update-2 @AVolpe:它不会改变任何东西,只需将消息移到标题文本字段的旁边。调用以下命令时出现错误:
public String create(Post post) {
this.post = postService.save(post);
return "pretty:posts";
}发布于 2014-07-11 02:55:35
因为JSF的2.2.6版本在BeanValidation上不能很好地工作,所以更新到2.2.7版本或者降级到2.2.4。
请参阅:This answer
发布于 2014-07-11 02:27:50
已按照AVolpe的建议升级jsf 2.2.7版本修复。
https://stackoverflow.com/questions/24632328
复制相似问题