相关疑难解决方法(0)

验证错误:值无效

我有一个ap:selectOneMenu的问题,无论我做什么我都无法让JSF调用JPA实体上的setter.JSF验证失败,显示以下消息:

form:location:验证错误:值无效

我有这个工作在几个相同类型的其他类(即,连接表类),但不能为我的生活让这一个工作.

如果有人可以针对此类问题提出一些故障排除/调试技巧,我们将不胜感激.

使用日志语句我已经验证了以下内容:

  1. Conveter将返回正确的,非null数值.
  2. 我的JPA实体中没有Bean验证.
  3. setLocation(Location location)永远不会调用setter .

这是我能做的最简单的例子,它根本不起作用:

<h:body>
    <h:form id="form">
        <p:messages id="messages" autoUpdate="true" />
        <p:selectOneMenu id="location" value="#{locationStockList.selected.location}" converter="locationConverter">
            <p:ajax event="change" update=":form:lblLocation"/>
            <f:selectItems value="#{locationStockList.locationSelection}"/>
        </p:selectOneMenu>
    </h:form>
</h:body>
Run Code Online (Sandbox Code Playgroud)

转换器:

@FacesConverter(forClass=Location.class, value="locationConverter")
public class LocationConverter implements Converter, Serializable {
    private static final Logger logger = Logger.getLogger(LocationConverter.class.getName());

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value.isEmpty())
            return null;
        try {
            Long id = Long.parseLong(value);
            Location location = ((LocationManagedBean) context.getApplication().getELResolver().getValue(context.getELContext(), null, "location")).find(id);
            logger.log(Level.SEVERE, …
Run Code Online (Sandbox Code Playgroud)

validation jsf jpa converter selectonemenu

77
推荐指数
1
解决办法
7万
查看次数

如何从数据库中填充h:selectOneMenu的选项?

我正在创建一个Web应用程序,您必须从DB中读取对象/实体列表并在JSF中填充它<h:selectOneMenu>.我无法对此进行编码.有人可以告诉我该怎么做吗?

我知道如何List<User>从数据库中获取数据.我需要知道的是,如何填充此列表<h:selectOneMenu>.

<h:selectOneMenu value="#{bean.name}">
    ...?
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

database jsf selectonemenu

69
推荐指数
2
解决办法
14万
查看次数

'null Converter'的转换错误设置值 - 为什么我需要JSF中的转换器?

我有理解如何有效地使用JSF 2中的选择和POJO /实体.例如,我试图Warehouse通过下面的下拉列表选择一个实体:

<h:selectOneMenu value="#{bean.selectedWarehouse}">
    <f:selectItem itemLabel="Choose one .." itemValue="#{null}" />
    <f:selectItems value="#{bean.availableWarehouses}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

以下托管bean:

@Named
@ViewScoped
public class Bean {

    private Warehouse selectedWarehouse;
    private List<SelectItem> availableWarehouses;

    // ...

    @PostConstruct
    public void init() {
        // ...

        availableWarehouses = new ArrayList<>();

        for (Warehouse warehouse : warehouseService.listAll()) {
            availableWarehouses.add(new SelectItem(warehouse, warehouse.getName()));
        }
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,我使用整个Warehouse实体作为值SelectItem.

当我提交表单时,会失败并显示以下消息:

'null Converter'的转换错误设置值'com.example.Warehouse@cafebabe'.

我希望Warehouse当我将它包装在一个中时,JSF可以将正确的对象设置为我的托管bean SelectItem.将我的实体包装在里面SelectItem意味着跳过Converter为我的实体创建一个.

Converter每当我想在我的实体中使用实体时,我真的必须使用<h:selectOneMenu>吗?JSF应该可以从可用项列表中提取所选项.如果我真的必须使用转换器,那么实际的方法是什么?到目前为止,我想到了这个:

  1. Converter为实体创建实现. …

jsf converter selectonemenu jsf-2

38
推荐指数
1
解决办法
5万
查看次数

如何在@FacesConverter中注入@ EJB,@ PersistenceContext,@ Inject,@ Autowired等?

我怎么可以注入的依赖一样@EJB,@PersistenceContext,@Inject,@AutoWired,等的@FacesConverter?在我的具体情况下,我需要通过@EJB以下方式注入EJB :

@FacesConverter
public class MyConverter implements Converter {

  @EJB
  protected MyService myService;    

  @Override
  public Object getAsObject(FacesContext context, UIComponent component, String value) {
    // myService.doSomething
  }

}
Run Code Online (Sandbox Code Playgroud)

然而,它没有被注射并且仍然存在null,导致NPE.看来,@PersistenceContext@Inject也不起作用.

如何在转换器中注入服务依赖项以便我可以访问数据库?

jsf dependency-injection ejb converter

28
推荐指数
1
解决办法
1万
查看次数

通用JSF实体转换器

我正在编写我的第一个Java EE 6 Web应用程序作为学习练习.我没有使用框架,只有JPA 2.0,EJB 3.1和JSF 2.0.

我有一个自定义转换器将存储在SelectOne组件中的JPA实体转换回实体.我正在使用InitialContext.lookup来获取对会话Bean的引用以查找相关的实体.

我想创建一个通用的实体转换器,所以我不必为每个实体创建一个转换器.我以为我会创建一个抽象实体并让所有实体扩展它.然后为抽象实体创建自定义转换器,并将其用作所有实体的转换器.

这听起来是否合理和/或切实可行?

是不是有一个抽象的实体,只是一个转换器来转换任何实体更有意义?在那种情况下,我不确定如何获得对相应会话Bean的引用.

我已经包含了我当前的转换器,因为我不确定我是否以最有效的方式获取对Session Bean的引用.

package com.mycom.rentalstore.converters;

import com.mycom.rentalstore.ejbs.ClassificationEJB;
import com.mycom.rentalstore.entities.Classification;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
import javax.naming.InitialContext;
import javax.naming.NamingException;

@FacesConverter(forClass = Classification.class)
public class ClassificationConverter implements Converter {

    private InitialContext ic;
    private ClassificationEJB classificationEJB;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {

        try {
            ic = new InitialContext();
            classificationEJB = (ClassificationEJB) ic.lookup("java:global/com.mycom.rentalstore_RentalStore_war_1.0-SNAPSHOT/ClassificationEJB");

        } catch (NamingException e) {
            throw new ConverterException(new FacesMessage(String.format("Cannot obtain …
Run Code Online (Sandbox Code Playgroud)

java jsf jsf-2

26
推荐指数
2
解决办法
3万
查看次数

为实体创建主 - 详细信息页面,如何链接它们以及选择哪个bean范围

我已经开始学习JSF,但遗憾的是,大多数教程只提供登录或注册部分.

你能指点我一些更深入的例子吗?我感兴趣的一件事是一个展示产品清单的页面.我在页面回家,我按下页面产品,以便我可以看到添加的最新产品.每次访问该页面时,都会根据数据库中的最新条目创建产品列表.我怎么处理这个?

解决此问题的一种方法是创建一个会话范围的托管bean,在其中我将通过其他托管bean更新不同的实体.我在一些教程中发现了这种方法,但它看起来很困难而且很笨拙.

哪个是解决这类问题的最佳方法?在两页主从细节用户界面中,会话范围的正确用法是什么?

session jsf scope master-detail

25
推荐指数
1
解决办法
2万
查看次数

针对具有静态WeakHashMap的通用JSF对象转换器的参数

我想避免使用样板代码来创建一个SelectItems列表,以便在视图和模型之间映射我的实体/ dtos,所以我使用了这个通用对象转换器的片段:

@FacesConverter(value = "objectConverter")
public class ObjectConverter implements Converter {

private static Map<Object, String> entities = new WeakHashMap<Object, String>();

@Override
public String getAsString(FacesContext context, UIComponent component, Object entity) {
    synchronized (entities) {
        if (!entities.containsKey(entity)) {
            String uuid = UUID.randomUUID().toString();
            entities.put(entity, uuid);
            return uuid;
        } else {
            return entities.get(entity);
        }
    }
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
    for (Entry<Object, String> entry : entities.entrySet()) {
        if (entry.getValue().equals(uuid)) {
            return entry.getKey();
        }
    }
    return null; …
Run Code Online (Sandbox Code Playgroud)

jsf converter jsf-2

5
推荐指数
1
解决办法
894
查看次数