ManagedBean 方法正在更改 dataTable 对象
ManagedBean method is changing dataTable object
我有一个 <p:dataTable />
,其中列出了我正在处理的网页的 "System Parameters"。其中一个参数是邮件服务器密码,它在数据库中以 Base64 编码。在数据表的最后一列中,我有一个按钮来编辑该参数,当我单击它时,会显示一个 bootstrap 模式,其中包含 "name" 和 "value" 字段。
我有一个范围为 @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)...
如果有人能给我解释一下这种行为,我将不胜感激。
实际上,您确实不小心更改了参数。看看这些行:
byte[] clv64 = Base64.getDecoder().decode(p.getVlrParameter().getBytes());
// ^^^^^^^^^^^^^^^
getParam().setVlrParameter(new String(clv64));
// ^^^^^^^^^^^^^^^
因此您第二次尝试解码已经以纯文本形式存储的参数。
我有一个 <p:dataTable />
,其中列出了我正在处理的网页的 "System Parameters"。其中一个参数是邮件服务器密码,它在数据库中以 Base64 编码。在数据表的最后一列中,我有一个按钮来编辑该参数,当我单击它时,会显示一个 bootstrap 模式,其中包含 "name" 和 "value" 字段。
我有一个范围为 @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)...
如果有人能给我解释一下这种行为,我将不胜感激。
实际上,您确实不小心更改了参数。看看这些行:
byte[] clv64 = Base64.getDecoder().decode(p.getVlrParameter().getBytes());
// ^^^^^^^^^^^^^^^
getParam().setVlrParameter(new String(clv64));
// ^^^^^^^^^^^^^^^
因此您第二次尝试解码已经以纯文本形式存储的参数。