【问题标题】:Using with JSF - HIbernate validation fails (javax.validation.ConstraintViolationException)与 JSF 一起使用 - HIbernate 验证失败 (javax.validation.ConstraintViolationException)
【发布时间】:2014-07-08 12:49:48
【问题描述】:

我正在使用 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 中创建一个新帖子时(忽略语法正确 à pretty-faces):

@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";
    }
}

后存储库:

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页面的title文本框旁边,就可以了。

<h:inputText id="title" value="#{postBean.post.title}" required="true"/>

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

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

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

public String create(Post post) {
        this.post = postService.save(post);
        return "pretty:posts";
    }

【问题讨论】:

  • 尝试将注释@NotNull 添加到您的属性中,因为Bean-Validation 属性null 没有@NotNull 注释始终有效。
  • 尝试在inputText之后添加&lt;h:message for="title" /&gt;
  • 为标题添加 h:message 只会显示标题属性的错误。调用 postService.save(post) 时会发生错误。
  • 我下载了你的项目并测试了它,我有很多错误,但原来的问题没有发生(验证工作正常),我用 jboss 7.1 测试了它(见postimg.org/image/pf31hehd1),顺便说一句,我在创建 URL 时遇到了很多问题。
  • 对,我保留了工作版本。如果您从帖子/新页面中删除 required="true",并将 @NotNull 添加到 domain/Post.java 中的标题属性,您将收到错误消息。只需运行 mvm clean install 以获取所有依赖项并在您的服务器上运行项目(我使用的是 Tomcat)。

标签: spring hibernate jsf-2


【解决方案1】:

由于this error 的版本2.2.6JSFBeanValidation 不兼容,请更新到版本2.2.7 或降级到2.2.4

见: This answer

【讨论】:

    【解决方案2】:

    按照 AVolpe 的建议,通过将 jsf 版本升级到 2.2.7 来修复。

    【讨论】:

      猜你喜欢
      • 2011-06-08
      • 2018-01-06
      • 1970-01-01
      • 2016-09-28
      • 2012-01-30
      • 2013-01-06
      • 2011-03-16
      • 2017-06-06
      • 1970-01-01
      相关资源
      最近更新 更多