Java 8默认接口方法在EL中未被识别为托管bean属性

Scr*_*ree 6 el cdi managed-bean default-method

我正在尝试设置自己的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";
   }
}
Run Code Online (Sandbox Code Playgroud)

所以我有登录网站的密码,用户名和验证方法.另外,O想要为Inputtext水印和Button提供一些默认的namings.如果执行人员想要改变它,他可以.

我使用自己的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为它可以这样工作.但我得到错误:'引起: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());
    }
}
Run Code Online (Sandbox Code Playgroud)

效果很好.打印出正确的字符串.无需实现默认方法来访问它们.那问题出在哪里?也许有像cdi,bean-resolver或者其他东西不知道这个java 8概念的东西?

小智 1

该问题可能是由 EL 依赖反射来查找适当的访问器方法引起的,但其方式对于默认方法来说是失败的。

考虑实现一个自定义的 ELResolver,类似于他们在这里所做的。