首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与JSF - HIbernate一起使用会导致(javax.validation.ConstraintViolationException)验证失败

与JSF - HIbernate一起使用会导致(javax.validation.ConstraintViolationException)验证失败
EN

Stack Overflow用户
提问于 2014-07-08 20:49:48
回答 2查看 366关注 0票数 0

我使用的是JSF、Spring和Hibernate。Post模型具有Hibernate注释属性:

代码语言:javascript
复制
@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中创建一个新的帖子时(忽略语法正确的漂亮面孔):

代码语言:javascript
复制
@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:

代码语言:javascript
复制
public interface PostRepository extends CrudRepository<Post, Long> {
    public Post findByTitleIgnoreCase(String title);
}

PostServiceImpl:

代码语言:javascript
复制
@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页面中,放在标题文本字段旁边,它就可以工作。

代码语言:javascript
复制
<h:inputText id="title" value="#{postBean.post.title}" required="true"/>

有什么想法吗?您可以在my github repo上找到该项目的源代码谢谢。

@NotNull是一个JSR303验证,@NotEmpty -是Hibernate的验证,这是唯一的区别。即使在更改为@NotNull之后,我仍然得到相同的错误。

更新顺便说一下,我删除了@ManagedBean注释,它不再需要了。update-2 @AVolpe:它不会改变任何东西,只需将消息移到标题文本字段的旁边。调用以下命令时出现错误:

代码语言:javascript
复制
public String create(Post post) {
        this.post = postService.save(post);
        return "pretty:posts";
    }
EN

回答 2

Stack Overflow用户

发布于 2014-07-11 02:55:35

因为JSF2.2.6版本在BeanValidation上不能很好地工作,所以更新到2.2.7版本或者降级到2.2.4

请参阅:This answer

票数 1
EN

Stack Overflow用户

发布于 2014-07-11 02:27:50

已按照AVolpe的建议升级jsf 2.2.7版本修复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24632328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档