我正在尝试设置我自己的 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 概念的东西?