当前位置: 首页 > 知识库问答 >
问题:

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

公冶高峯
2023-03-14

我有一个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");
}

所有没有自己定义的对象的方法都可以工作(例如,映射、字符串、列表等),访问xhtml中的对象甚至子对象就像一个魅力。
但是,调用此deletePrivilege会导致:

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无法将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中以某种方式定义包吗?

共有1个答案

鲁展
2023-03-14

这取决于您是如何解决特权的,所以如果您是如何反序列化它,我也遇到了同样的问题,我是使用jackson反序列化json中的设备模型

class Device{}
devices = objectMapper.readValue(responseBody, List.class);

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

devices = objectMapper.readValue(responseBody, new TypeReference<>() {});

而且效果很好。

 类似资料:
  • 问题内容: 我有一个应用程序,该应用程序使用Jackson将我的复杂对象编组为JSON,从而在DynamoDB中存储一些数据。 例如,我要编组的对象可能如下所示: SomeObject可能看起来像这样: 和SomeOtherObject可能看起来像这样: 可以很好地将对象整理成问题并将其作为JSON字符串存储在数据库中。 当需要从DynamoDB检索数据时,Jackson会自动检索JSON并将其转

  • 某个物体可能看起来像这样: 另一个物体可能是这样的: 这很好,因为对象被封送,没有问题,并以JSON字符串的形式存储在DB中。

  • 问题内容: 我将直接从问题开始,稍后再提供更多背景信息。 简单 :我有一个,它代表一个特定的对象。将其转换为该对象的最佳方法是什么? 我知道您可以使用泛型来遍历所有元素并设置字段,但是什么是嵌套对象呢? 背景 :我有一个使用JSON对象的JAX- RS服务。我的服务处理不同类型的对象,仅代表一个接口。因此,我不知道哪些对象来自外部以及哪个程序正在使用我的服务。 在运行时,我通过界面上的信息。JAX

  • 问题内容: 我有一个JSON对象,我将其转换为并在此处进行一些处理。稍后,我想转换相同的缓冲区数据以转换为有效的JSON对象。 我正在研究Node V6.9.1 下面是我尝试过的代码,但是当我转换回JSON却无法打开该对象时遇到了。 所以我尝试使用检查方式打印整个对象 如果我尝试像数组一样读取它 我也尝试解析它抛出 我需要将其视为我创建的真实对象(我的意思是像上面声明的那样)。 请帮忙.. 问题答

  • 问题内容: 我正在从事Spring MVC项目。我正在使用Hibernate。我想将AJAX与jQuery结合使用,以从Spring Controller中获取一些JSON。不幸的是,当我在应用程序中实现方法时,出现了一个错误: 我必须使用哪种适配器以及以哪种方式使用?该方法的最后一行发生了错误: 这是我在Spring MVC项目中与Hibernate一起使用的班级: 编辑 我想知道:我的对象是代

  • 我正试图将下面的json转换成java bean,需要你的帮助 Sort.json 我的豆子看起来像 我的测试课是 我看到的错误是 请建议: