我有一个<p:dataTable />
,它列出了我正在工作的网页的“系统参数”。其中一个参数是邮件服务器密码,它被编码为数据库中的Base64。在datatable的最后一列中,我有一个用于编辑该参数的按钮,当我单击它时,将显示一个引导模式,其中包含字段"name“和"value”。
我有一个带有@ViewScoped
作用域的ManagedBean,还有一个函数可以识别要编辑的参数是否是邮件服务器密码,以便对该值进行解码。该方法将对象作为datatable iteration对象的参数获取。我的问题是,当我第一次打开模式时,对象的值是正确的,但在第二次对象值改变时,它会产生一个异常,因为值已经被解码了,并且值里面有一个点,它会产生错误。
我不明白为什么datatable对象的值会被更改,而我从来不会逐字更改它。
我使用的是PrimeFaces、BootsFaces、JSF2.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)...
如果有人能给我解释一下这种行为,我将不胜感激。
发布于 2018-06-09 03:00:43
实际上,您确实意外地更改了参数。看看下面这几行:
byte[] clv64 = Base64.getDecoder().decode(p.getVlrParameter().getBytes());
// ^^^^^^^^^^^^^^^
getParam().setVlrParameter(new String(clv64));
// ^^^^^^^^^^^^^^^
所以当你第二次尝试解码已经以纯文本存储的参数时。
https://stackoverflow.com/questions/50746686
复制相似问题