ManagedBean方法正在改变dataTable对象

时间:2018-06-07 17:03:33

标签: primefaces jsf-2.2 bootsfaces

我有<p:dataTable />列出了我正在使用的网页的“系统参数”。其中一个参数是邮件服务器密码,它在DB中以Base64编码。在数据表的最后一列,我有一个按钮来编辑这些参数,当我点击它时,会显示一个带有“name”和“value”字段的bootstrap模式。

我有一个带有@ViewScoped范围的ManagedBean,以及一个能够识别要编辑的参数是否为邮件服务器密码的函数,以便对值进行解码。该方法将对象作为数据表迭代对象的参数。我的问题是,第一次打开模态时,对象的值是正确的,但是第二次对象值改变并且它生成异常,因为该值已经被解码,并且值内部有一个点并且它生成错误。

我不明白为什么当我从不改变它时,数据表对象值会被改变。

我正在使用PrimeFaces,BootsFaces,JSF 2.2。这是我的<p:dataTable />

<p:dataTable value="#{parameterBean.listParameter}" var="p" 
                         paginator="true" rows="10" 
                         reflow="true" id="tblParameter" 
                         emptyMessage="No data available.">
    <!-- Some columns -->

    <p:column headerText="Options">
        <b:commandButton value="Edit" icon="edit" look="info" 
                         ajax="true" update="parametroForm" 
                         onclick="ajax:parameterBean.editParameter(p)" 
                         oncomplete="$('#parameterModal').modal('show');" />
</p:dataTable>

这是我的bean方法:

public void editParameter(TblParameter p) {
   System.out.println("ENCODE: " + p.getVlrParameter());
    this.param = new TblParameter(); //- This is an object in the bean to access it from modal form.

    try {
        setParam(p);

        if (getParam().getIdParameter().equals(new Long(4))) {//- Validate if is the server mail password.
            byte[] clv64 = Base64.getDecoder().decode(p.getVlrParameter().getBytes());
            getParam().setVlrParameter(new String(clv64));
        }

    } catch(Exception e) {
        System.out.println("Error: " + e.getMessage());
        e.printStackTrace();
    }
}

最后,正如我所说,当我第一次打开模态时,打印的输出是:

ENCODE: MTIzLjQ1Ng==

但是第二次,它显示:

ENCODE: 123.456
java.lang.IllegalArgumentException: Illegal base64 character 2e
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at com.abcpagos.otis.beans.admin.ParametroBean.editarParametro(ParametroBean.java:146)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)...

如果有人可以请我解释一下这种行为,我会非常感激。

1 个答案:

答案 0 :(得分:0)

实际上,您确实会意外更改参数。看看这些内容:

byte[] clv64 = Base64.getDecoder().decode(p.getVlrParameter().getBytes());
//                                          ^^^^^^^^^^^^^^^
getParam().setVlrParameter(new String(clv64));
//         ^^^^^^^^^^^^^^^                

所以第二次尝试解码已经存储在纯文本中的参数。