Java JSF2:如何处理控制器中的异常?

Java JSF2:如何处理控制器中的异常?,java,exception,jsf,jsf-2,Java,Exception,Jsf,Jsf 2,我想做一个登记表,它可以很好地工作: <h:form id="register_form"> <h:panelGrid columns="3"> <h:outputLabel for="email" value="E-mail:" /> <h:inputText id="emai

我想做一个登记表,它可以很好地工作:

<h:form id="register_form">
            <h:panelGrid columns="3">
                <h:outputLabel for="email" value="E-mail:" />
                <h:inputText id="email" value="#{userc.userb.user.email}">
                    <f:ajax event="blur" render="m_email" />
                </h:inputText>
                <h:message id="m_email" for="email" ajaxRendered="false" />

                <h:outputLabel for="password" value="Passoword" />
                <h:inputSecret id="password" value="#{userc.userb.user.password}">
                    <f:validator validatorId="confirmPasswordValidator" />
                    <f:attribute name="confirm" value="#{confirmPassword.submittedValue}" />
                </h:inputSecret>
                <h:message id="m_password" for="password" />

                <h:commandButton value="Registerr" action="#{userc.register}">
                    <f:ajax execute="@form" render="@form" />
                </h:commandButton>
                
                <h:messages globalOnly="true" layout="table" />
                
            </h:panelGrid>
        </h:form>
例如,如果某个用户尝试注册自己两次,我会返回此消息,说这是重复的,但我想知道这是否是最好的方法


如何处理这些类型的异常?

这些验证应该由业务逻辑层对象处理,在这种情况下,它看起来像是
userEAO
对象。您可以决定是否应该以异常的方式处理此错误消息(IMHO不会使用异常)

在我的例子中,我更喜欢使用一个
Message
类,它基本上包含一个整数代码和一个保存操作结果的消息。在我的例子中,我通常返回0或更多表示操作成功,并使用负代码声明错误。这是一个非常基本的例子:

public class Message {
    private int code;
    private String message;
    //constructor...
    //getters and setters...
}

public class UserBL {

    public Message create(User user) {
        //do some fancy validations
        if (!verifyDuplicatedUser(user)) {
            return new Message(-1000, "Duplicated user");
        }
        //and the operations...
        saveUser(user);
        return new Message(0, "Register successfully!");
    }

}
现在,您的控制器将了解它必须真正做什么(这意味着,没有繁重的业务逻辑验证):

当您需要验证一组数据时,这种方法甚至可以帮助您,例如验证Excel工作表的结果,并且必须显示错误列表(因为多次显示单个错误非常烦人!)


您可以改进创建消息的方式,比如从包含系统消息的表中检索消息,或者使用属性文件来处理国际化(当然,这取决于您的功能需求)。

这些验证应该由业务逻辑层对象来处理,在这种情况下,它看起来像是
userEAO
对象。您可以决定是否应该以异常的方式处理此错误消息(IMHO不会使用异常)

在我的例子中,我更喜欢使用一个
Message
类,它基本上包含一个整数代码和一个保存操作结果的消息。在我的例子中,我通常返回0或更多表示操作成功,并使用负代码声明错误。这是一个非常基本的例子:

public class Message {
    private int code;
    private String message;
    //constructor...
    //getters and setters...
}

public class UserBL {

    public Message create(User user) {
        //do some fancy validations
        if (!verifyDuplicatedUser(user)) {
            return new Message(-1000, "Duplicated user");
        }
        //and the operations...
        saveUser(user);
        return new Message(0, "Register successfully!");
    }

}
现在,您的控制器将了解它必须真正做什么(这意味着,没有繁重的业务逻辑验证):

当您需要验证一组数据时,这种方法甚至可以帮助您,例如验证Excel工作表的结果,并且必须显示错误列表(因为多次显示单个错误非常烦人!)


您可以改进创建消息的方式,比如从包含系统消息的表中检索消息,或者使用属性文件处理国际化(当然,这取决于您的功能需求)。

为什么不检查userb.getUser()并根据它确定要做什么。如果其重复或存在错误。这两种方法都可以解决问题。为什么不检查userb.getUser()并根据它确定要做什么呢。如果其重复或存在错误。这两种方法都能解决问题。Luiggi说得对。但是我应该如何处理例外情况呢?例如,当它是一个重复条目时?我想知道如何知道哪个异常是要知道如何处理它,明白吗?重复条目可能是或不可能是一个异常,这取决于您的观点。在我看来,这是一个应用程序错误,可以使用
if/else
语句来处理。请记住,处理一般的
异常是一个非常糟糕的想法。使用
e.getMessage().contains()
从系统中获取资源是很难维护和读取的。我提出的解决方案更易于维护,对新手来说更具可读性,更灵活,并且将业务逻辑与托管Bean和业务层分离,最后一个应该完成繁重的工作。请记住:您应该分离应用程序错误(如重复的用户验证)和Java异常(索引自动边界或按零划分),您应该同时处理这两种情况,但使用不同的方法。这确实取决于您的设计。Luiggi的观点很好。但我应该如何处理异常?例如,当它是重复条目时?我想知道如何知道哪个异常是要知道如何处理它,明白吗?重复条目可能是或不可能是异常,这取决于您的观点在我看来,这是一个应用程序错误,您可以使用
if/else
语句来处理。请记住,处理常规
异常
是一个非常糟糕的想法。使用
e.getMessage().contains()从系统中获取资源
很难维护和阅读。我提出的解决方案更易于维护,对新手来说更具可读性,更灵活,并且将业务逻辑与托管Bean和业务层分离,最后一层应该完成繁重的工作。请记住:您应该分离应用程序错误(如重复用户验证)和Java异常(IndexOutOfBounds或DivisionByZero),您应该同时处理这两种情况,但使用不同的方法。这实际上取决于您的设计。
public void register() {
    FacesMessage fmessage;
    userb.encryptPassword();
    Message message = userEAO.create(userb.getUser());
    fmessage = new FacesMessage(message.getMessage());
    FacesContext.getCurrentInstance().addMessage(null, fmessage);
}