首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF不会将LinkedHashMap转换为正确的对象(javax.el.MethodNotFoundException)

JSF不会将LinkedHashMap转换为正确的对象(javax.el.MethodNotFoundException)
EN

Stack Overflow用户
提问于 2016-03-18 23:44:28
回答 1查看 472关注 0票数 1

我有一个JSF应用程序,除了在ManagedBean中调用以对象作为参数的方法之外,一切都运行得很好:

代码语言:javascript
复制
<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中:

代码语言:javascript
复制
public void deletePrivilege(Privilege privilege) {
    System.out.println("test");
}

所有方法,没有自己定义的对象,工作(例如映射,字符串,列表,...)并且访问xhtml中的对象甚至子对象就像是一种魔力。

但是,调用此deletePrivilege会导致:

代码语言:javascript
复制
javax.servlet.ServletException: javax.el.MethodNotFoundException: [...]privileges.xhtml @31,138 action="#{sContr.deletePrivilege(privilege)}": Method not found: [...]sContrl@604b7816.deletePrivilege(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:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<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>

我的对象:

代码语言:javascript
复制
@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

EN

回答 1

Stack Overflow用户

发布于 2020-05-25 20:16:50

这取决于您如何解决权限,所以如果您正在以某种方式对其进行反序列化,我也遇到了同样的问题,我使用json从json反序列化设备模型。

代码语言:javascript
复制
class Device{}
devices = objectMapper.readValue(responseBody, List.class);

它给出了同样的错误,我解决了反序列化的问题,比如

代码语言:javascript
复制
devices = objectMapper.readValue(responseBody, new TypeReference<>() {});

而且它工作得很完美。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36088639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档