我下载了PrimeFaces showcase-6.2.war并将其部署在运行于EE 8的JBoss WildFly 12.0.0.Final上。拖放'DataTable'示例工作正常。
对于测试/ PoC,我已经使用我自己的一些数据(确切地)复制了展示示例。哪个填充&显示在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
答案 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;}