在我的应用程序中,我遇到一个问题,当类中的getter仅在接口中默认(Java 8特性)时,结果没有Java Beans属性.即正常方法调用它只是作为一种标准方法,但对于通过"属性"访问它突然表现不同......
这是一个测试用例:
import java.beans.Introspector;
import java.util.Arrays;
import java.util.stream.Collectors;
import org.apache.commons.beanutils.PropertyUtils;
public class test
{
public static void main (String[] arguments) throws Exception
{
// Normal language-level invocation, works fine.
System.out.println (new Bean1 ().getFoo ());
System.out.println (new Bean2 ().getFoo ());
// Printing Java Beans properties; Bean2 doesn't have 'foo' property...
System.out.println (Arrays.stream (Introspector.getBeanInfo (Bean1.class).getPropertyDescriptors ())
.map ((property) -> property.getName ())
.collect (Collectors.joining (", ")));
System.out.println (Arrays.stream (Introspector.getBeanInfo (Bean2.class).getPropertyDescriptors ())
.map ((property) -> property.getName ())
.collect (Collectors.joining (", ")));
// …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置自己的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() { …Run Code Online (Sandbox Code Playgroud) 我有一个具有以下默认方法的接口:
default Integer getCurrentYear() {return DateUtil.getYear();}
Run Code Online (Sandbox Code Playgroud)
我还有一个实现此接口的控制器,但它不会覆盖该方法.
public class NotifyController implements INotifyController
Run Code Online (Sandbox Code Playgroud)
我试图从我的xhtml访问此方法,如下所示:
#{notifyController.currentYear}
Run Code Online (Sandbox Code Playgroud)
但是,当我打开屏幕时,会出现以下错误:
The class 'br.com.viasoft.controller.notify.notifyController' does not have the property 'anoAtual'
Run Code Online (Sandbox Code Playgroud)
如果我从我的控制器的实例访问此方法,它返回正确的值,但是当我尝试从我的xhtml访问它作为"属性"时,它会发生此错误.
有没有办法从我的控制器的引用访问此接口属性,而无需实现该方法?
我希望以编程方式添加一个自定义的VariableResolver,当JSF或类似的东西没有使用时,所以在寻找1中提到的范围内的bean之前,EL会首先尝试解析其中的变量.
目标是使数据库中的对象可以通过其名称在EL中使用,并且可以将很多对象放入某个范围.
现在我将一个特殊的bean放在名为"z"的会话范围内,并且该bean扩展了Map接口,因此可以使用$ {z.address},$ {z.fullName}等表达式访问对象.我试图消除'z'.
如果我设法将我的解析器插入过滤器中更好(确保我会检查不要为每个Web请求多次执行此操作)
(编辑:也许我在谈论ELContext,如何放置我自己的VariableMapper或ELResolver或类似的东西)