6

独自の JSF タグ ライブラリをセットアップしようとしています。そこで、このコンポーネントのバッキング Bean を構築するための青写真として、バッキング インターフェースを持つ複合コンポーネントを作成しました。

public interface CompLogin {
   String getUsername();
   void setUsername(String username);

   String getPassword();
   void setPassword(String password);

   String validateLogin();

   default String getPasswordWatermark() {
      return "Passwort";
   }

   default String getUsernameWatermark() {
      return "Loginname:";
   }

   default String getLoginButtonValue() {
      return "Login";
   }
}

したがって、ログインサイトのパスワード、ユーザー名、および検証メソッドがあります。さらに、入力テキストの透かしとボタンにいくつかのデフォルトの名前を付けたいと考えています。実装者がそれを変更したい場合は、変更できます。

独自の JSF タグを使用して、実際のアプリケーションの Backing Bean 内にこのインターフェースを実装しました。

@Named
@RequestScoped
public class Login implements Serializable, CompLogin {

    private String username;
    private String password;


    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String validateLogin() {
        System.out.println(username + " " + password);
        return null;
    }
}

私はそれがこのように機能すると思いました。しかし、エラーが表示されます:「原因: javax.el.PropertyNotFoundException: クラス 'Login' にはプロパティ 'usernameWatermark' がありません。」

インターフェイスのデフォルトの実装は、実装する Bean に継承されていないようです。コンポーネントのデフォルトの実装を提供するために、なぜ、そして何をすればよいのでしょうか?

編集:インターフェースのデフォルトメソッドconecptの誤解を避けるために、次のことを試しました。私は自分のインターフェースを取り、通常の Java プロジェクトでクラスを実装し、Login クラスを介して getLoginButtonValue にアクセスしようとしました。

public class Main {

    public static void main(String[] args) {
        Login log = new Login();
        System.out.println(log.getLoginButtonValue());
    }
}

非常にうまく機能します。正しい文字列が出力されました。それらにアクセスするためにデフォルトのメソッドを実装する必要はありません。では、どこに問題があるのでしょうか。たぶん、cdi、bean-resolver、またはこのJava 8の概念を認識していない何かがあるのでしょうか?

4

2 に答える 2