1

カスタム コントロールには、(ビューではなく) フォルダー内の列を参照するこの繰り返しコントロールがあります。フォルダーのデフォルトのデザインは、カスタム コントロールと組み合わせて、時間の経過とともに変更できます。そのため、カスタム コントロールのコードがフォルダーのデザインよりも新しいため、デザインが一致せず、XPage でエラーが発生する可能性があります。

特に欲しいのは、カスタム コントロールが、欠落しているビュー/フォルダー列に関連するエラー、または同様の設計エラーを処理することです。エラーはどこかに報告され、状況を修復する何かをアクティブにできることをユーザーに通知します。

JavaScript エラーをトラップする方法は知っていますが、残念ながらすべての列の値は Expression Language です。もちろん、それらを再コーディングすることもできますが、もっと良い方法があるかどうか知りたいです。

要するに、式言語エラーをトラップするにはどうすればよいですか?

4

2 に答える 2

3

独自のとEL独自の を追加することで、言語エラーをトラップできます。これを行うには、2 つの Java クラスを作成する必要があります。VariableResolverPropertyResolver

  1. 変数リゾルバー

    package ch.hasselba.xpages.demo;
    
    import javax.faces.application.FacesMessage;
    import javax.faces.context.FacesContext;
    import javax.faces.el.EvaluationException;
    import javax.faces.el.VariableResolver;
    
    public class ELErrVariableResolver extends VariableResolver {
    
      private final VariableResolver delegate;
    
      public ELErrVariableResolver(VariableResolver resolver) {
        delegate = resolver;
      }
    
      @Override
      public Object resolveVariable(FacesContext context, String name) throws EvaluationException {
          Object variable = null;
          try{
              variable = delegate.resolveVariable(context, name);
          }catch( EvaluationException ee ){
              addResolveErrMessage( context, name );
          }
    
         return variable;
      }
    
      public void addResolveErrMessage( FacesContext context , String name ){
          FacesMessage msg = new FacesMessage();
          msg.setSummary( "BAD EL! Variable '" + name + "' not found." );
          msg.setSeverity( FacesMessage.SEVERITY_FATAL );
          context.addMessage("BAD EL!", msg);
      }
    }
    
  2. プロパティ リゾルバー

    package ch.hasselba.xpages.demo;
    
    import javax.faces.application.FacesMessage;
    import javax.faces.context.FacesContext;
    import javax.faces.el.EvaluationException;
    import javax.faces.el.PropertyNotFoundException;
    import javax.faces.el.PropertyResolver;
    
    public class ELErrPropertyResolver extends PropertyResolver{
    
        private final PropertyResolver delegate;
    
          public ELErrPropertyResolver(PropertyResolver resolver) {
            delegate = resolver;
          }
    
    
        @Override
        public Class getType(Object paramObject1, Object paramObject2)
                throws EvaluationException, PropertyNotFoundException {
            Class c = null;
            try{
                c = delegate.getType(paramObject1, paramObject2);
            }catch(Exception e){
                addResolveErrMessage( FacesContext.getCurrentInstance(), paramObject1.toString() + "." + paramObject2.toString() );
            }
            return c;
        }
    
        @Override
        public Class getType(Object paramObject, int paramInt)
                throws EvaluationException, PropertyNotFoundException {
            Class c = null;
            try{
                c = delegate.getType(paramObject, paramInt);
            }catch(Exception e){
                addResolveErrMessage( FacesContext.getCurrentInstance(), paramObject.toString() + "." + paramInt );
            }
            return c;
        }
    
        @Override
        public Object getValue(Object paramObject1, Object paramObject2)
                throws EvaluationException, PropertyNotFoundException {
            Object c = null;
    
            try{
                c = delegate.getValue(paramObject1, paramObject2);
            }catch(Exception e){
                addResolveErrMessage( FacesContext.getCurrentInstance(), paramObject1.toString() + "."  + paramObject2.toString() );
            }
            return c;
        }
    
        @Override
        public Object getValue(Object paramObject, int paramInt)
                throws EvaluationException, PropertyNotFoundException {
            Object c = null;
            try{
                c = delegate.getValue(paramObject, paramInt);
            }catch(Exception e){
                addResolveErrMessage( FacesContext.getCurrentInstance(), paramObject.toString() + "." + paramInt );
            }
            return c;
        }
    
        @Override
        public boolean isReadOnly(Object paramObject1, Object paramObject2)
                throws EvaluationException, PropertyNotFoundException {
            boolean c = false;
            try{
                c = delegate.isReadOnly(paramObject1, paramObject2);
            }catch(Exception e){
                addResolveErrMessage( FacesContext.getCurrentInstance(), paramObject1.toString() + "." + paramObject2.toString() );
            }
            return c;
        }
    
        @Override
        public boolean isReadOnly(Object paramObject, int paramInt)
                throws EvaluationException, PropertyNotFoundException {
            boolean c = false;
            try{
                c = delegate.isReadOnly(paramObject, paramInt);
            }catch(Exception e){
                addResolveErrMessage( FacesContext.getCurrentInstance(), paramObject.toString() + "." + paramInt );
            }
            return c;
        }
    
        @Override
        public void setValue(Object paramObject1, Object paramObject2,
                Object paramObject3) throws EvaluationException,
                PropertyNotFoundException {
            try{
                delegate.setValue(paramObject1, paramObject2, paramObject3);
            }catch(Exception e){
                addResolveErrMessage( FacesContext.getCurrentInstance(), paramObject1.toString() + "." + paramObject2.toString() );
            }
    
        }
    
        @Override
        public void setValue(Object paramObject1, int paramInt, Object paramObject2)
                throws EvaluationException, PropertyNotFoundException {
    
            try{
                delegate.setValue(paramObject1, paramInt, paramObject2);
            }catch(Exception e){
                addResolveErrMessage( FacesContext.getCurrentInstance(), paramObject1.toString() + "." + paramInt );
            }
    
        }
    
        public void addResolveErrMessage( FacesContext context , String name ){
              FacesMessage msg = new FacesMessage();
              msg.setSummary( "BAD EL! Property '" + name + "' not found." );
              msg.setSeverity( FacesMessage.SEVERITY_FATAL );
              context.addMessage("BAD EL!", msg);
          }
    }
    
  3. 新しいリゾルバーを に追加しますfaces-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <faces-config>
       <application>
            <variable-resolver>ch.hasselba.xpages.demo.ELErrVariableResolver
            </variable-resolver>
            <property-resolver>ch.hasselba.xpages.demo.ELErrPropertyResolver
            </property-resolver>
        </application>
    </faces-config>
    
  4. CC にxp:messagesメッセージを表示するコンポーネントを追加します (または、クラスのエラー ルーチンを変更して、必要なものを追加します。

于 2013-01-20T15:37:08.693 に答える
2

カスタム コントロールでは、使用するフォルダー/ビューが正しいかどうかを確認できます。赤は正しいデザインです。これは beforepageload イベントで実行できます。デザイン チェックでエラーが報告された場合、エラーはログ ファイルに書き込まれ、ユーザーに「適切な」メッセージが表示されます。

エラー ログは、xlogger のようなopenntfのさまざまなログ プロジェクトで 実行できます。コードがエラーを報告する場合、「displayRepeat」と呼ばれるスコープ値を false に設定できます。繰り返しコントロール (およびその他のコントロール) は、この displayRepeat 値に従ってレンダリングする必要があります。

ユーザーに適切なエラー メッセージを表示します。コントロールの上にエラー コントロールを配置し、次のコードを追加します。

facesContext.addMessage( null, 
new javax.faces.application.FacesMessage( "your error message" ) );
于 2013-01-19T07:21:28.963 に答える