65388


JavaEEにてアプリ作成をしています。  
入力値検証アノテーションを用いて、入力値のチェックをしているのですが、  
エラーが発生した際に、戻るボタン等を押しても機能しなくなってしまいます。  
エラー発生時でも、他のボタンが機能するにはどうすればいいのでしょうか？  
宜しくお願いします。

[code]

    /**
     * 編集画面のバッキングBean
     */
    @Model
    @ViewScoped
    public class EditBean extends AbstractBean implements Serializable {
    
        @Inject
        private EditLogic logic;
    
        @NotEmpty(message="{errors.required}")
        private String empCode;
    
        @NotEmpty(message="{errors.required}")
        private String name;
    
        @Pattern(regexp="^([\\w])+([\\w\\._-])*\\@([\\w])+([\\w\\._-])*\\.([a-zA-Z])+$")
        private String email;
    
        private Integer versionNo;
    
        private String editEmpCode;
    
        private boolean disableEmpCode;
    
        /**
         * @return empCode
         */
        public String getEmpCode() {
            return empCode;
        }
        /**
         * @param empCode セットする empCode
         */
        public void setEmpCode(String empCode) {
            this.empCode = empCode;
        }
        /**
         * @return name
         */
        public String getName() {
            return name;
        }
        /**
         * @param name セットする name
         */
        public void setName(String name) {
            this.name = name;
        }
        /**
         * @return email
         */
        public String getEmail() {
            return email;
        }
        /**
         * @param email セットする email
         */
        public void setEmail(String email) {
            this.email = email;
        }
        /**
         * @return versionNo
         */
        public Integer getVersionNo() {
            return versionNo;
        }
        /**
         * @param versionNo セットする versionNo
         */
        public void setVersionNo(Integer versionNo) {
            this.versionNo = versionNo;
        }
        /**
         * @return editEmpCode
         */
        public String getEditEmpCode() {
            return editEmpCode;
        }
        /**
         * @param editEmpCode セットする editEmpCode
         */
        public void setEditEmpCode(String editEmpCode) {
            this.editEmpCode = editEmpCode;
        }
        /**
         * @return disableEmpCode
         */
        public boolean isDisableEmpCode() {
            return disableEmpCode;
        }
        /**
         * @param disableEmpCode セットする disableEmpCode
         */
        public void setDisableEmpCode(boolean disableEmpCode) {
            this.disableEmpCode = disableEmpCode;
        }
    
        /**
         * 初期処理
         */
        @PostConstruct
        @Auth
        public void init(){
            this.setEditEmpCode(FlashUtil.get("empCode"));
            logic.init(this);
        }
    
        /**
         * 戻るボタン押下時処理
         * @return 遷移先画面
         */
        @Auth
        public String back(){
            // 検索画面に戻る
            return "/views/employee/search/index.xhtml?faces-redirect=true";
        }
    
        /**
         * 保存ボタン押下時処理
         * @return 遷移先画面
         */
        @Auth
        public String save(){
            logic.save(this);
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage("", CommonUtil.getFacesInfoMessage("messages.add.complete"));
            return null;
        }
    
        /**
         * 削除ボタン押下時処理
         * @param empCode
         * @return 遷移先画面
         */
        @Auth
        public String delete(){
            logic.delete(this);
            return back();
        }
    }
    
    
[/code]

[code]

    /**
     * 編集画面のビジネスロジック
     */
    @Stateless
    public class EditLogicImpl implements EditLogic {
    
        @Inject
        private EmployeeDao dao;
    
        /**
         * 初期処理
         * @param bean 編集画面のバッキングBean
         */
        @Override
        public void init(EditBean bean){
            String empCode = bean.getEditEmpCode();
            if(empCode != null){
                Employee employee = dao.findById(empCode);
                bean.setEmpCode(employee.getEmpCode());
                bean.setName(employee.getName());
                bean.setEmail(employee.getEmail());
                bean.setVersionNo(employee.getVersionNo());
                bean.setDisableEmpCode(true);
            }
            if(bean.getVersionNo() == null){
                bean.setVersionNo(0);
            }
        }
    
        /**
         * 保存処理
         * @param bean 編集画面のバッキングBean
         */
        @Override
        public void save(EditBean bean){
            Employee employee = new Employee();
            employee.setEmpCode(bean.getEmpCode());
            employee.setName(bean.getName());
            employee.setEmail(bean.getEmail());
            employee.setVersionNo(bean.getVersionNo());
    
            if(bean.isDisableEmpCode()){
                // 更新
                dao.update(employee);
                bean.setVersionNo(employee.getVersionNo());
            }else{
                // 新規登録
                dao.insert(employee);
                bean.setDisableEmpCode(true);
            }
        }
    
        /**
         * 削除処理
         * @param bean 編集画面のバッキングBean
         */
        @Override
        public void delete(EditBean bean){
            // 削除
            dao.delete(bean.getEmpCode());
        }
    }
    
    
[/code]


CC BY-SA 4.0
2020-04-06T01:07:04.637
65380
2020-04-06T07:32:34.030
2020-04-06T03:44:38.200
2808
question
java-ee jsf
入力値検証アノテーションによるエラー発生時


こちらの質問「[エラー原因がわかりません](https://ja.stackoverflow.com/q/65320/2808)」の続きかと思いますが、`immediate="true"`を付与してみてください。

[code]

    <h:commandButton class="return" action="#{editBean.back()}" value="戻る" immediate="true" />
    
[/code]

* * *

`immediate`属性については公式チュートリアルに正しく説明されており、具体例もあります:

  * [10.2.1.2 The immediate Attribute - Java Platform, Enterprise Edition: The Java EE Tutorial](https://docs.oracle.com/javaee/7/tutorial/jsf-page002.htm#sthref480)

> If the button's `immediate` attribute is set to `true` but the field's
> `immediate` attribute is set to `false`, the event associated with the
> button is processed without updating the field's local value to the model
> layer. The reason is that any events, conversion, and validation associated
> with the field occur _after_ request parameter values are applied.


CC BY-SA 4.0
2020-04-06T03:43:26.810
65388
2020-04-06T07:32:34.030
2020-04-06T07:32:34.030
2808
2808
65380
answer