0

Я новичок в разработке JSF и уже имеют некоторые проблемы с проверкой боб я не могу добраться до работы:JSF 2.2 Tomcat 8, Bean Validation

Как Servlet контейнер, я использую Tomcat 8.0. 22 вместе с JSF 2.2 (Mojarra 2.2).

Проблема в том, что аннотации проверки в коде не запускаются.

Например, у меня есть клиент класса с именем атрибута, который должен быть заполнен <h:inputText>. Вход передается без проблем для объекта, но аннотированные проверки не запускаются.

Ни @NotNull ни @Size, ни что-либо еще не срабатывает, поэтому я думаю, что это проблема с Tomcat, а не с JSF.

У меня есть следующие Баночки:

  • bval-ядро-0.5.jar
  • bval-jsr303-0.5.jar
  • валидация-апи-1.0.0.GA.jar

в папке WEB-INF/lib моего WebApp и в папке lib Tomcat. Конечно, они также находятся в классе приложений.

Я уже пробовал его с валидатором спящего режима, но не могу его запустить.

Я не знаю, что я здесь не получаю и благодарю за помощь!

Заранее благодарен!

Бенедикту

Вот код:

User.java: 

package com.example; 

import java.io.Serializable; 
import java.util.Date; 

import javax.faces.application.FacesMessage; 
import javax.faces.context.FacesContext; 
import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 

public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private Long id; 
    @Size(min = 1, message = "Please enter username") 
    private String username; 
    @NotNull(message = "Please enter password") 
    private String password; 
    @NotNull(message = "Please enter email") 
    private String email; 
    private Date birthdate; 

... 
} 

Register.java:

package com.example; 

import java.io.Serializable; 

import javax.annotation.PostConstruct; 
import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 
import javax.faces.context.FacesContext; 

@ManagedBean 
@ViewScoped 
public class Register implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private User user; 

    @PostConstruct 
    public void init() { 
     user = new User(); 
    } 

    public void submit() { 
     FacesMessage message = new FacesMessage("Registration succesful for: " 
       + user.getUsername() + ", Username is null: " + (user.getUsername() == null)); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
     } 

    public User getUser() { 
     return user; 
    } 
} 

register.xhtml:

<!DOCTYPE html> 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
<h:head> 
    <title>Insert title here</title> 
</h:head> 
<h:body> 
    <h:form id="Form"> 
     <h:panelGrid columns="3"> 
      <h:outputLabel for="username">Username</h:outputLabel> 
      <h:inputText id="username" value="#{register.user.username}"> 
       <f:ajax event="blur" render="usernameMessage" /> 
      </h:inputText> 
      <h:message id="usernameMessage" for="username" /> 
      <h:outputLabel for="password">Password</h:outputLabel> 
      <h:inputSecret id="password" value="#{register.user.password}" redisplay="true"> 
       <f:ajax event="blur" render="passwordMessage" /> 
      </h:inputSecret> 
      <h:message id="passwordMessage" for="password" /> 
      <h:outputLabel for="email">Email</h:outputLabel> 
      <h:inputText id="email" value="#{register.user.email}"> 
       <f:ajax event="blur" render="emailMessage" /> 
      </h:inputText> 
      <h:message id="emailMessage" for="email" /> 
      <h:outputLabel for="birthdate">Birthdate (yyyy-MM-dd)</h:outputLabel> 
      <h:inputText id="birthdate" value="#{register.user.birthdate}"> 
       <f:convertDateTime pattern="yyyy-MM-dd" /> 
       <f:ajax event="blur" render="birthdateMessage" /> 
      </h:inputText> 
      <h:message id="birthdateMessage" for="birthdate" /> 
      <h:panelGroup /> 
      <h:commandButton value="Register" action="#{register.submit}"> 
       <f:ajax execute="@form" render="@form" /> 
      </h:commandButton> 
      <h:messages globalOnly="true" layout="table" /> 
     </h:panelGrid> 
    </h:form> 
</h:body> 
</html> 

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 
    <display-name>JSFFaceletsTutorial</display-name> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 
    <context-param> 
     <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>client</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
     <param-value>resources.application</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    <listener> 
     <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
    </listener> 
</web-app> 
+0

Просьба указать код в соответствии с запросом в [ask] – Kukeltje

+1

Является ли это приемлемым, как обман? http://stackoverflow.com/questions/7545231/notnull-notblank-and-notempty-bean-validation-does-not-work-in-jsf/ – BalusC

+0

Ну, я уже прочитал этот пост, но почему-то я все еще могу " t получить валидацию для работы. У меня есть необходимые банки в папке WEB-INF и в папке Tomcat lib. – civben85

ответ

0

Что я сделал для решения этой проблемы, так это то, что я загрузил Hibernate api для проверки с hibernate-validator.

Он поставляется с необходимыми зависимостями в папке lib/required. Я скопировал банки валидатора спящего режима и необходимые банки в папку lib Apache Tomcat 8.

Вы не должны помещать эти банки в WEB-INF/lib вашего приложения. Я попытался поместить их туда, чтобы узнать, что произойдет, но у меня были ошибки при развертывании приложения.

Вы можете сказать, что удаление библиотек в папке Tomcat lib не является хорошей практикой, но если вы развертываете приложение, использующее проверку бонуса в Glassfish, вам не придется выполнять всю эту работу, потому что они встроены в JEEServer. Это означает, что эти библиотеки доступны на сервере Apache Tomcat.

Смежные вопросы