【问题标题】:java.lang.UnsupportedOperationException: Cannot set ServletRequest Parameterjava.lang.UnsupportedOperationException:无法设置 ServletRequest 参数
【发布时间】:2012-12-27 05:37:00
【问题描述】:

我正在处理一个 JSF 1.1 项目。

JSP:

<h:column>
        <f:facet name="header"> <h:outputText value="Edit" />     </f:facet>

        <h:commandLink rendered="#{(Table1_var.status == 'CONFIRMED') or (Table1_var.status == 'CHECKED_IN')}"
            action="#{Table1_var.onEditReservation}">
            <h:graphicImage id="view-details-link" alt="Drill Down on the Dynamic Link!"
                    url="images/editReservationSmall.png" styleClass="view-details-img"/>
           <f:param
                name="VastuId"
                value="#{Table1_var.id}" />                 
        </h:commandLink>

        <f:facet name="footer"><h:outputText value="Edit" /> </f:facet>                
    </h:column>

在&lt;f:param&gt; 中,VastuId 参数被分配了id。因为var=Table1_var 我不知道它在哪里与类映射。但是我通过手动搜索获得了类/方法,该值可以从哪里获得:

public void navReservationDetail(final ActionEvent e) {
    Calendar cal1 = Calendar.getInstance();
    String rowId = FacesHelper.getRequestParameter("VastuId");
    System.out.println("ID :"+rowId);
}

FacesHelper.getRequestParameter是

public static String getRequestParameter(String parameter) {
    return (String) FacesContext.getCurrentInstance().getExternalContext()
            .getRequestParameterMap().get(parameter);
}

我想在不使用 UI 的情况下通过 Java 手动设置该参数。我试过用这个:

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().put("#{VastuId}", reservationBean.getParentReservationProperty());              
String rowId = FacesHelper.getRequestParameter("VastuId");
System.out.println("selectedVastuId = "+rowId);

它在getRequestParameterMap().put() 处抛出异常

java.lang.UnsupportedOperationException: Cannot set ServletRequest Parameter
at org.apache.myfaces.context.servlet.RequestParameterMap.setAttribute
(RequestParameterMap.java:44)
at org.apache.myfaces.context.servlet.AbstractAttributeMap.put(AbstractAttributeMap.java:104)

这是怎么引起的,我该如何解决?

【问题讨论】:

    标签: jsf jsf-1.2 http-request-parameters


    【解决方案1】:

    parameter map 是只读的。在 servlet 环境中,此数据结构表示 URL 查询部分中的值(例如 http://foo/bar?queryValue=queryKey。)服务器只能通过向浏览器发出重定向调用来更改这些值。

    在基本 JSF 1.1/1.2 实现中可用的每用户读/写范围是 request 和 session。

    将数据放入作用域时,您应该使用文字名称而不是 EL 表达式:

    FacesContext.getCurrentInstance()
                .getExternalContext()
                .getRequestMap()
                .put("VastuId", reservationBean.getParentReservationProperty()); 
    

    然后可以使用表达式#{VastuId} 或#{requestScope.VastuId} 在视图中解析该值。

    【讨论】:

    • 非常感谢我会在分钟内尝试。在获取时使用 .getRequestParameterMap().get(parameter) 那么我可以使用 .getRequestMap().put(,) 吗?
    • .getRequestMap().put("VastuId",id) 给我 null 和 if .getRequestParameterMap().put( "VastuId",id) 给出相同的错误。我将它用于我的 REST web 服务
    • 如果FacesContext 为空,那么您正试图在FacesServlet 之外访问它。这不受支持。
    • 有一个简单的类,我在其中放置并获取它的值。并且为了获取我正在使用 FacesContext.getCurrentInstance().getExternalContext() .getRequestParameterMap().get(parameter) 它给了我警告类型安全:方法 put(Object, Object) 属于原始类型 Map。对泛型类型 Map 的引用应该被参数化
    猜你喜欢
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多