用于p:selectOneMenu的转换器的应用程序作用域bean

问题描述 投票:0回答:1

我已经通过github和PrimeFaces实现了PrimeFaces selectOneMenu,并且不清楚为什么themeservice-bean被定义为Application作用域,例如]

@Named
@ApplicationScoped
public class ThemeService {

    private List<Theme> themes;

    @PostConstruct
    public void init() {
        themes = new ArrayList<>();
        themes.add(new Theme(0, "Nova-Light", "nova-light"));
        themes.add(new Theme(1, "Nova-Dark", "nova-dark"));
        themes.add(new Theme(2, "Nova-Colored", "nova-colored"));
        themes.add(new Theme(3, "Luna-Blue", "luna-blue"));
        themes.add(new Theme(4, "Luna-Amber", "luna-amber"));
        themes.add(new Theme(5, "Luna-Green", "luna-green"));
        themes.add(new Theme(6, "Luna-Pink", "luna-pink"));
        themes.add(new Theme(7, "Omega", "omega"));
    }

    public List<Theme> getThemes() {
        return themes;
    } 
}

在我看来,同一个bean应该定义为View / Request范围的,因为列表可能需要填充不同的记录,但是当我更改范围时,它给出了错误的信息

java.lang.NullPointerException
    at org.primefaces.showcase.convert.ThemeConverter.getAsObject(ThemeConverter.java:27)

在转换器中的返回语句处

                ThemeService service = (ThemeService) fc.getExternalContext().getApplicationMap().get("themeService");
                return service.getThemes().get(Integer.parseInt(value));

可能有人对此有所说明。

jsf primefaces
1个回答
0
投票

您尝试从仅存储应用程序范围的bean的applicationMap中获取请求或查看范围的bean。

尝试用getRequestMap或getViewMap替换getApplicationMap。

甚至更好@将themeService注入您的转换器:

How to inject @EJB, @PersistenceContext, @Inject, @Autowired, etc in @FacesConverter?

© www.soinside.com 2019 - 2024. All rights reserved.