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";
   }
}

所以我有登录站点的密码、用户名和验证方法。此外,O 希望为 Inputtext 水印和按钮提供一些默认命名。如果执行人想改变它,他可以。

我使用自己的 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项目中使用了我的接口和der实现类,试图通过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

4

使用 Apache EL 可以通过全名调用默认方法来工作。尝试在您的代码中以这种方式使用它:

#{login.getUsernameWatermark()}
于 2017-05-30T09:28:04.553 回答
1

该问题很可能是由 EL 依赖反射来查找适当的访问器方法引起的,但是以默认方法失败的方式执行此操作。

考虑实现与他们在此处所做的类似的自定义 ELResolver 。

于 2017-04-10T10:56:39.327 回答