相关疑难解决方法(0)

如何选择合适的bean范围?

我注意到有不同的bean范围,如:

@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped
Run Code Online (Sandbox Code Playgroud)

每个人的目的是什么?如何为我的bean选择合适的范围?

jsf scope jsf-2 managed-bean

372
推荐指数
2
解决办法
20万
查看次数

支持bean(@ManagedBean)或CDI Beans(@Named)?

我刚开始阅读Core JavaServer Faces,第3版.他们这样说(强调我的):

对于可以在JSF页面中使用的bean,有两种不同的机制,CDI bean和JSF托管bean,这是一个历史事故.我们建议您使用CDI bean,除非您的应用程序必须在像Tomcat这样的普通servlet运行器上运行.

为什么?他们没有提供任何理由.我一直在使用@ManagedBean在GlassFish 3上运行的原型应用程序中的所有bean,我还没有发现任何问题.我不介意迁移@ManagedBean到@Named,但我想知道为什么我应该打扰.

jsf java-ee cdi jsf-2

106
推荐指数
3
解决办法
7万
查看次数

在任何与Servlet相关的类中按名称获取JSF托管bean

我正在尝试编写一个自定义servlet(用于AJAX/JSON),我想在其中引用我@ManagedBeans的名字.我希望能够映射:

http://host/app/myBean/myProperty

至:

@ManagedBean(name="myBean")
public class MyBean {
    public String getMyProperty();
}
Run Code Online (Sandbox Code Playgroud)

是否可以从常规servlet中按名称加载bean?是否有我可以使用的JSF servlet或帮助程序?

我似乎被春天宠坏了,这一切都太明显了.

jsf servlets java-ee jsf-2 managed-bean

98
推荐指数
2
解决办法
15万
查看次数

Field.get(obj)返回注入的CDI托管bean上的所有null,而手动调用getter则返回正确的值

我正在尝试通过反射从JSF页面的后备bean访问某些字段的值。问题是,当我使用getter时,我会得到正确的值,但是当我使用必要字段的get(obj)方法时,我总是会返回空值。

获取beanObject:

ELContext elcontext = FacesContext.getCurrentInstance().getELContext();
Object beanObject = FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elcontext, null, beanName);
Run Code Online (Sandbox Code Playgroud)

要在不使用getter的情况下获取字段值,请执行以下操作:

List<Field> fields = new ArrayList<Field>();
ParamsBuilder.getAllFields(fields, beanClass);

for(Field field: fields) {

    field.setAccessible(true);
    System.out.println(field.getName() + ": " + field.get(beanObject)); //just to see if it works

}
Run Code Online (Sandbox Code Playgroud)

getAllFields方法具有以下实现:

public static List<Field> getAllFields(List<Field> fields, Class<?> type) {
    for (Field field: type.getDeclaredFields()) {
        fields.add(field);
    }

    if (type.getSuperclass() != null) {
        fields = getAllFields(fields, type.getSuperclass());
    }

    return fields;
}
Run Code Online (Sandbox Code Playgroud)

要使用getter获取值,请执行以下操作:

private ClassX getValue(Object beanObject, Class<?> beanClass) throws Exception {

    Method getter = …
Run Code Online (Sandbox Code Playgroud)

java reflection jsf cdi managed-bean

4
推荐指数
1
解决办法
1903
查看次数

标签 统计

jsf ×4

jsf-2 ×3

managed-bean ×3

cdi ×2

java-ee ×2

java ×1

reflection ×1

scope ×1

servlets ×1