我正在尝试设置我自己的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";
}
}所以我有一个登录网站的密码,用户名和验证方法。此外,我还想为Inputtext水印和按钮提供一些默认名称。如果实施者想要改变它,他可以。
我使用自己的JSF标记在一个实际应用程序的支持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中似乎没有继承接口的默认实现。为什么我可以做什么来为我的组件提供默认实现?
编辑:我尝试了以下几点来忽略对接口默认方法概念的误解。我在一个普通的java项目中使用了我的接口和der实现类,试图通过Login类访问getLoginButtonValue。
public class Main {
public static void main(String[] args) {
Login log = new Login();
System.out.println(log.getLoginButtonValue());
}
}效果非常好。打印出正确的字符串。不需要实现访问它们的默认方法。那么问题出在哪里呢?也许有像cdi,bean解析器之类的东西没有意识到这个java8的概念?
发布于 2017-05-30 17:28:05
使用Apache EL时,这是通过调用默认方法的全名来实现的。在你的代码中尝试这样使用它:
#{login.getUsernameWatermark()}发布于 2017-04-10 18:56:39
这个问题很可能是因为EL依赖反射来找到适当的访问器方法,但是对于默认方法来说,这样做是失败的。
考虑实现一个与here类似的自定义ELResolver。
https://stackoverflow.com/questions/37205642
复制相似问题