Метод ManagedBean меняет объект dataTable - PullRequest
0 голосов
/ 07 июня 2018

У меня есть <p:dataTable />, в котором перечислены «Системные параметры» веб-страницы, с которой я работаю.Одним из таких параметров является пароль почтового сервера, который кодируется в Base64 в БД.В последнем столбце таблицы данных у меня есть кнопка для редактирования этих параметров, и когда я щелкаю по ней, появляется модал начальной загрузки с полями «имя» и «значение».

У меня есть ManagedBean с областью действия @ViewScoped и функция, которая также распознает, является ли параметр для редактирования паролем почтового сервера, для декодирования значения.Метод получает объект в качестве аргумента объекта итерации с датой.Моя проблема заключается в том, что при первом открытии модального режима значение объекта является правильным, но во второй раз значение объекта изменяется, и оно генерирует исключение, поскольку значение уже декодировано, а значение имеет точку внутри и создаетошибка.

Я не понимаю, почему значение объекта данных изменяется, когда я никогда не изменяю его буквально.

Я использую 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 голосов
/ 08 июня 2018

На самом деле, вы меняете параметр случайно.Посмотрите на эти строки:

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

Итак, во второй раз вы пытаетесь декодировать параметр, который уже сохранен в виде простого текста.

...