Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF和Bean验证组_Jsf_Jsf 2_Bean Validation - Fatal编程技术网

JSF和Bean验证组

JSF和Bean验证组,jsf,jsf-2,bean-validation,Jsf,Jsf 2,Bean Validation,我使用JavaEE7JSF2.2,Bean验证1.1。。。以及WildFly 8.1运行时中的primefaces 5.1 我想根据按下的按钮使用不同的验证组。与少量约束关联的“保存”按钮和与大量约束关联的“提交”按钮 bean验证组似乎正是我所需要的,但我在web界面方面有一些问题 根据验证模式:保存或提交,我不希望无效输入显示为红色 所以我做了3个接口: public interface LifeCycleValidation {} public interface Save extends

我使用JavaEE7JSF2.2,Bean验证1.1。。。以及WildFly 8.1运行时中的primefaces 5.1

我想根据按下的按钮使用不同的验证组。与少量约束关联的“保存”按钮和与大量约束关联的“提交”按钮

bean验证组似乎正是我所需要的,但我在web界面方面有一些问题

根据验证模式:保存或提交,我不希望无效输入显示为红色

所以我做了3个接口:

public interface LifeCycleValidation {}
public interface Save extends LifeCycleValidation {}
public interface Submit extends Save {}
我在模型对象中使用BeanVal和appropiate组对字段进行注释

@Size(min=3, max = 300, groups = Save.class)
@NotNull(groups = Save.class)
private String title ;

@Size(min = 3, max = 5, groups = Submit.class)
private List<String> keywords ;
并尝试在commandButton的actionListener中设置适当的模式

    <h:form id="bookEditForm">
        <p:messages showDetail="true" showSummary="true"/>
        <p:panelGrid columns="3">

            <p:outputLabel value="title" for="title"/>
            <p:inputText value="#{book.title}" id="title">
                <f:validateBean validationGroups="#{book.validationGroups}"/>
            </p:inputText>
            <p:message showDetail="true" showSummary="true" for="title"/>

            <p:outputLabel value="keywords" for="keywords"/>
            <p:inputText value="#{book.keywords}" id="keywords" converter="converter.ListString">
                <f:validateBean validationGroups="#{book.validationGroups}"/>
            </p:inputText>
            <p:message showDetail="true" showSummary="true" for="keywords"/>

        </p:panelGrid>

        <p:commandButton value="save" action="#{book.save()}" actionListener="#{book.setValidationMode('SAVE')}" update="@form"/>
        <p:commandButton value="submit" action="#{book.submit()}" actionListener="#{book.setValidationMode('SUBMIT')}" update="@form"/>

    </h:form>
但这不起作用


我想写我自己的jsf验证器,但我不知道如何实现验证器来根据正确的组验证字段。我最终发现了一些东西,当onmouseover发生时,我触发setValidationMode,就像在调用action:save或submit之前设置了验证模式一样

        <h:panelGroup layout="span">
            <p:ajax event="mouseover" listener="#{book.setValidationMode('SAVE')}"/>
            <p:commandButton value="save" action="#{book.save()}" update="@form"/>
        </h:panelGroup>            
        <h:panelGroup layout="span">
            <p:ajax event="mouseover" listener="#{book.setValidationMode('SUBMIT')}"/>
            <p:commandButton value="submit" action="#{book.submit()}" update="@form"/>
        </h:panelGroup>
编辑

以下是干净完整的MVC解决方案,progressbar以奖金计算:

观点:

    <h:form id="bookEditForm">

        <p:progressBar value="#{bookBean.progress}" labelTemplate="{value}%" id="progress"/>

        <p:messages showDetail="true" showSummary="true"/>

        <p:panelGrid columns="3">

            <p:outputLabel value="title" for="title"/>
            <p:inputText value="#{bookBean.book.title}" id="title">
                <f:validateBean validationGroups="#{bookBean.validationGroups}"/>
            </p:inputText>
            <p:message showDetail="true" showSummary="true" for="title"/>

            <p:outputLabel value="keywords" for="keywords"/>
            <p:inputText value="#{bookBean.book.keywords}" id="keywords" converter="converter.ListString">
                <f:validateBean validationGroups="#{bookBean.validationGroups}"/>
            </p:inputText>
            <p:message showDetail="true" showSummary="true" for="keywords"/>

        </p:panelGrid>

        <h:panelGroup layout="span">
            <p:ajax event="mouseover" listener="#{bookBean.setValidationMode('SAVE')}"/>
            <p:commandButton value="save" action="#{bookBean.save()}" update="@form"/>
        </h:panelGroup>            
        <h:panelGroup layout="span">
            <p:ajax event="mouseover" listener="#{bookBean.setValidationMode('SUBMIT')}"/>
            <p:commandButton value="submit" action="#{bookBean.submit()}" update="@form"/>
        </h:panelGroup>

    </h:form>
模型:

public class Book implements Serializable {

    @NotNull(groups = Save.class)
    @Size(min=1, max = 140, groups = Save.class)
    private String title ;

    @NotNull(groups = Submit.class)
    @Size(min = 3, max = 5, groups = Submit.class)
    private List<String> keywords ;

    // getters and setters
}
ValidationMode、LifeCycleValidation、Save和Submit与问题中的相同

OmniFaces似乎有一个很好的解决方案:
可能很有趣…

不支持键盘post?尝试在p:commandButton上使用actionListener。actionListener中的setValidationMode不起作用,因为setValidationMode需要更新页面中的所有f:validateBean,这在actionListener和ActionButton之间没有发生,而p:commandButton的onmouseover中的do setValidationMode也不起作用,我不知道为什么。。。
    <h:form id="bookEditForm">
        <p:messages showDetail="true" showSummary="true"/>
        <p:panelGrid columns="3">

            <p:outputLabel value="title" for="title"/>
            <p:inputText value="#{book.title}" id="title">
                <f:validateBean validationGroups="#{book.validationGroups}"/>
            </p:inputText>
            <p:message showDetail="true" showSummary="true" for="title"/>

            <p:outputLabel value="keywords" for="keywords"/>
            <p:inputText value="#{book.keywords}" id="keywords" converter="converter.ListString">
                <f:validateBean validationGroups="#{book.validationGroups}"/>
            </p:inputText>
            <p:message showDetail="true" showSummary="true" for="keywords"/>

        </p:panelGrid>

        <p:commandButton value="save" action="#{book.save()}" actionListener="#{book.setValidationMode('SAVE')}" update="@form"/>
        <p:commandButton value="submit" action="#{book.submit()}" actionListener="#{book.setValidationMode('SUBMIT')}" update="@form"/>

    </h:form>
        <h:panelGroup layout="span">
            <p:ajax event="mouseover" listener="#{book.setValidationMode('SAVE')}"/>
            <p:commandButton value="save" action="#{book.save()}" update="@form"/>
        </h:panelGroup>            
        <h:panelGroup layout="span">
            <p:ajax event="mouseover" listener="#{book.setValidationMode('SUBMIT')}"/>
            <p:commandButton value="submit" action="#{book.submit()}" update="@form"/>
        </h:panelGroup>
private ValidationMode validationMode = ValidationMode.SAVE ;

public void setValidationMode(String validationModeTitle) {
    this.validationMode = ValidationMode.valueOf(validationModeTitle);
}

public String getValidationGroups() {
    return validationMode.cl.getCanonicalName() ;
}

public void save() {
    // save
    addInfoMessage("","saved") ;
}

public void submit() {
    // submit
    addInfoMessage("","submited") ;
}
    <h:form id="bookEditForm">

        <p:progressBar value="#{bookBean.progress}" labelTemplate="{value}%" id="progress"/>

        <p:messages showDetail="true" showSummary="true"/>

        <p:panelGrid columns="3">

            <p:outputLabel value="title" for="title"/>
            <p:inputText value="#{bookBean.book.title}" id="title">
                <f:validateBean validationGroups="#{bookBean.validationGroups}"/>
            </p:inputText>
            <p:message showDetail="true" showSummary="true" for="title"/>

            <p:outputLabel value="keywords" for="keywords"/>
            <p:inputText value="#{bookBean.book.keywords}" id="keywords" converter="converter.ListString">
                <f:validateBean validationGroups="#{bookBean.validationGroups}"/>
            </p:inputText>
            <p:message showDetail="true" showSummary="true" for="keywords"/>

        </p:panelGrid>

        <h:panelGroup layout="span">
            <p:ajax event="mouseover" listener="#{bookBean.setValidationMode('SAVE')}"/>
            <p:commandButton value="save" action="#{bookBean.save()}" update="@form"/>
        </h:panelGroup>            
        <h:panelGroup layout="span">
            <p:ajax event="mouseover" listener="#{bookBean.setValidationMode('SUBMIT')}"/>
            <p:commandButton value="submit" action="#{bookBean.submit()}" update="@form"/>
        </h:panelGroup>

    </h:form>
@Named
@ViewScoped
public class BookBean implements Serializable {

    private ValidationMode validationMode = ValidationMode.SAVE;

    private Book book ;

    public BookView() {
        book = new Book() ;
    }

    public void setValidationMode(String validationModeTitle) {
        this.validationMode = ValidationMode.valueOf(validationModeTitle);
    }

    public String getValidationGroups() {
        return validationMode.cl.getCanonicalName() ;
    }

    public Book getBook() {
        return book;
    }

    public void save() {
        // save...
        addMessage("",FacesMessage.SEVERITY_INFO,"Success","Infos saved") ;
    }

    public void submit() {
        //submit...
        addMessage("",FacesMessage.SEVERITY_INFO,"Success","Infos submitted") ;
    }

    private void addMessage(String clientId, FacesMessage.Severity severity, String summary, String detail) {
        FacesMessage message = new FacesMessage(severity, summary, detail);
        FacesContext.getCurrentInstance().addMessage(clientId, message);
    }

    public int getProgress() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory() ;
        Validator validator = factory.getValidator();
        int nbConstraints = validator.getConstraintsForClass(Book.class).getConstrainedProperties().size() ;
        int nbViolations = validator.validate(book, Submit.class).size();
        return 100 - (nbViolations*100) / (nbConstraints) ;
    }
}
public class Book implements Serializable {

    @NotNull(groups = Save.class)
    @Size(min=1, max = 140, groups = Save.class)
    private String title ;

    @NotNull(groups = Submit.class)
    @Size(min = 3, max = 5, groups = Submit.class)
    private List<String> keywords ;

    // getters and setters
}