p:dataTable上的'拖放'事件方法未调用

时间:2018-05-03 09:49:59

标签: jsf primefaces

我下载了PrimeFaces showcase-6.2.war并将其部署在运行于EE 8的JBoss WildFly 12.0.0.Final上。拖放'DataTable'示例工作正常。

对于测试/ PoC,我已经使用我自己的一些数据(确切地)复制了展示示例。哪个填充&am​​p;显示在DataTable中。

但是,当我将项目拖到“选定窗格”时,我收到错误:

  

SEVERE [javax.enterprise.resource.webcontainer.jsf.context](默认   task-1)javax.el.MethodNotFoundException:找不到方法:class   com.notifywell.controller.NOTiFYwellController.onIngredientDrop(org.primefaces.event.DragDropEvent)

调用它的XHTML是:

<p:droppable for="fieldsetSelectedIngredients" tolerance="touch" activeStyleClass="ui-state-highlight" datasource="dataTableAvailableIngredients" onDrop="handleDrop">
    <p:ajax listener="#{nOTiFYwellController.onIngredientDrop}" update="dropArea dataTableAvailableIngredients" />
</p:droppable>

PrimeFace ShowCase:

<p:ajax listener="#{dndCarsView.onCarDrop}" update="dropArea availableCars" />

我的Java'支持bean'使用方法''onIngredientDrop“:

@Model
@Path("/")
@ViewScoped // OmniFaces 3.1
@Named("nOTiFYwellController")
//@ManagedBean(name="nOTiFYwellController") // Deprecated
public class NOTiFYwellController implements Serializable {
     .....

    public void onIngredientDrop(DragDropEvent ddEvent) {
        Ingredient ingredient = ((Ingredient) ddEvent.getData());

        logger.info("***** onIngredientDrop ddEvent = {}", ddEvent.getData());
    }
}

PrimeFace ShowCase:

public void onCarDrop(DragDropEvent ddEvent) {
        Car car = ((Car) ddEvent.getData());

        droppedCars.add(car);
        cars.remove(car);
}

错误是由于p:ajax listener没有传递DragDropEvent参数。

在PF ShowCase示例中,不需要该参数。如何在我的支持bean中获取'DragDropEvent'?

如果我使用没有参数的'onIngredientDrop'方法,它将被调用并显示(修订的)日志消息。

我的环境:

  

PrimeFace 6.2.3 JSF 2.3 JBoss WildFly 12.0.0.FINAL Java版   1.8.0_66(build 1.8.0_66-b17)谷歌浏览器版本66.0.3359.117(官方版本)(64位)macOS High Sierra 10.13.4

TIA

1 个答案:

答案 0 :(得分:1)

  

您的代码包含一个矛盾:@Model = @Named + @RequestScoped和   额外的@Named采用默认的类名。所以请制作   你的想法......从JSF使用的bean上的@Path也是   罕见。也许您需要在服务类中添加更多代码并调用   来自@ Path + @ Model注释类的类和来自a的类   @Named和@ViewScoped。与此同时,你会感到奇怪   想要使用两种不同的豆子--Kukeltje

@Kukeltje建议解决

是的,错误是在我的@Model Controller中混合了JSF支持bean的注释。

我移动了方法&#39; onIngredientDrop&#39;致敬的&#39; JSF支持bean并包含在我的WAR中进行部署。

// @ManagedBean(name = "ingredientBean") // Deprecated
@Named
@ViewScoped
public class IngredientBean implements Serializable {

    /**
     *
     */
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     *
     */
    private List<Ingredient> droppedIngredients = new ArrayList<Ingredient>();

    /**
     * @param ddEvent DragDropEvent
     */
    public void onIngredientDrop(DragDropEvent ddEvent) {
        Ingredient ingredient = ((Ingredient) ddEvent.getData());

        logger.info("***** onIngredientDrop ingredient = {}", ingredient.toString());

        //droppedIngredients.add(Ingredient);
    }
}

WildFly控制台输出:

  

12:10:04,021 INFO [com.notifywell.jsf.IngredientBean](默认   task-3)***** onIngredientDrop成分=   成分{id =&#39; 5aec3dc5c0a118606e42a11b&#39;,成分名称=&#39;叶酸&#39;}