我有一个JSF应用程序,除了调用ManagedBean中以对象为参数的方法外,一切都很正常。
<p:dataTable value="#{sContr.privileges}" var="privilege">
<p:column>
<h:outputText value="#{privilege.name}"/>
</p:column>
<p:column>
<h:outputText value="#{privilege.description}"/>
</p:column>
<p:column>
<h:commandButton action="#{sContr.deletePrivilege(privilege)}" image="somePath"/>
</p:column>
</p:dataTable>
在sContr:
public void deletePrivilege(Privilege privilege) {
System.out.println("test");
}
所有的方法,没有自己定义的对象,都可以工作(例如Maps, Strings, Lists, ...),并且访问对象,甚至xhtml中的子对象都可以正常工作。然而,调用这个deletePrivilege的结果是。
javax.servlet.ServletException: javax.el.MethodNotFoundException: [...]privileges.xhtml @31,138 action="#{sContr.deletePrivilege(privilege)}": Method not found: [...][email protected](java.util.LinkedHashMap)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
[...]
这些对象是在另一个模块中定义的,而不是JSF应用程序,并且是普通的java对象(没有特定的JSF注释)。
所以,出于某种原因,JSF无法将LinkedHashMap自动转换回用于渲染页面的类的实例。
faces-config.xml。
<?xml version='1.0' encoding='UTF-8'?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<managed-bean>
<managed-bean-name>currentDate</managed-bean-name>
<managed-bean-class>java.util.Date</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
</faces-config>
maven包含了JSF和primefaces的内容。
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>5.1</version>
</dependency>
<dependency>
<groupId>org.primefaces.extensions</groupId>
<artifactId>primefaces-extensions</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.primefaces.themes</groupId>
<artifactId>all-themes</artifactId>
<version>1.0.10</version>
</dependency>
我的对象
@Entity
public class Privilege implements IEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column()
private Long id;
@Column()
private String name;
@Column()
private String description;
public Privilege(String name) {
this.name = name;
}
public Privilege(Long id, String name) {
this.id = id;
this.name = name;
}
public Privilege(Long id, String name, String description) {
this(id, name);
this.description = description;
}
public Privilege() {
}
@Override
public Long getId() {
return id;
}
@Override
public void setId(Long id) {
this.id = id;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(final String description) {
this.description = description;
}
}
另外要说明的是:LinkedHashMap包含了id、名称和描述(所以它应该有构建正确对象的所有内容)。
问题出在哪里?我是否需要在 faces-config 中定义这个包?
使用的是 Mojarra 2.2.6, primefaces 5.1, primefaces-extensions 2.1.0。
这取决于你是如何解决特权的,所以如果你是反序列化它,它可能会,我有同样的问题,我是用jackson从json反序列化Device模型。
class Device{}
devices = objectMapper.readValue(responseBody, List.class);
它给出了同样的错误正是我解决反序列化像
devices = objectMapper.readValue(responseBody, new TypeReference<>() {});
而且工作得很完美。