首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ManagedBean方法正在更改dataTable对象

ManagedBean方法正在更改dataTable对象
EN

Stack Overflow用户
提问于 2018-06-08 01:03:33
回答 1查看 80关注 0票数 0

我有一个<p:dataTable />,它列出了我正在工作的网页的“系统参数”。其中一个参数是邮件服务器密码,它被编码为数据库中的Base64。在datatable的最后一列中,我有一个用于编辑该参数的按钮,当我单击它时,将显示一个引导模式,其中包含字段"name“和"value”。

我有一个带有@ViewScoped作用域的ManagedBean,还有一个函数可以识别要编辑的参数是否是邮件服务器密码,以便对该值进行解码。该方法将对象作为datatable iteration对象的参数获取。我的问题是,当我第一次打开模式时,对象的值是正确的,但在第二次对象值改变时,它会产生一个异常,因为值已经被解码了,并且值里面有一个点,它会产生错误。

我不明白为什么datatable对象的值会被更改,而我从来不会逐字更改它。

我使用的是PrimeFaces、BootsFaces、JSF2.2。这是我的<p:dataTable />

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

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

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

代码语言:javascript
复制
ENCODE: MTIzLjQ1Ng==

但在第二次,它显示:

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

如果有人能给我解释一下这种行为,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 03:00:43

实际上,您确实意外地更改了参数。看看下面这几行:

代码语言:javascript
复制
byte[] clv64 = Base64.getDecoder().decode(p.getVlrParameter().getBytes());
//                                          ^^^^^^^^^^^^^^^
getParam().setVlrParameter(new String(clv64));
//         ^^^^^^^^^^^^^^^                

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

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

https://stackoverflow.com/questions/50746686

复制
相关文章

相似问题

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