2016-07-20 6 views
1

творю страницу, на которой я называю метод PrettyFaces действий загрузки страницы:Двойной вызов к действию - prettyfaces - JSF

<url-mapping id="informes-perfil"> 
    <pattern value="/informes/#{informesPerfilMB.codigo}" /> 
    <view-id value="/faces/informes_perfil.xhtml" /> 
    <action onPostback="false">#{informesPerfilMB.load()}</action> 
</url-mapping> 

По какой-то причине, informesPerfilMB.load() действие вызывается дважды, и значение параметра во втором вызове «null» или «RES_NOT_FOUND».

Вот мой метод загрузки:

public void load() { 
    if (isPostBack) { 
     isPostBack = false; 
     try { 
      System.out.println(codigo); 
      informe = informeEJBServiceLocal.getByCodigo(codigo); 
      this.buscarInformeIngreso(); 
      this.buscarInformeOtroIngreso(); 
     } catch (EJBServiceException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Переменная isPostBack инициализируется false, так что это должно предотвратить метод от вызова снова, но по какой-то причине.

Этот код сначала печатает String: dcc509a6f75849b. Затем, когда нагрузка повторяется, она печатает это: RES_NOT_FOUND

Я надеюсь, что этот код поможет объяснить, что происходит достаточно, чтобы решить мою проблему, спасибо.

+0

Не могли бы вы включить вашу конфигурацию? web.xml и faces-config.xml? – chkal

+0

Кроме того, какую версию PrettyFaces вы используете? – Lincoln

+0

Это также поможет, если вы установите точку останова (или напечатали трассировку стека) в этом методе и разместили стек, чтобы мы могли видеть, откуда вызывается метод. Это первый шаг, чтобы понять, почему метод вызывается дважды. – Lincoln

ответ

1

Во-первых, причина, по которой ваша переменная isPostBack вызывается дважды, скорее всего, потому что у вас есть два экземпляра компонента, а не один экземпляр singleton. Есть несколько причин, по которым это может произойти:

  • Ваш bean-объект является объектом запроса, и на страницу выполняется несколько запросов.
  • Ваш компонент создается несколько раз частями вашего приложения, которые его используют, и вызывают метод load().

Я также считаю, что это возможно, что ваш метод вызывается дважды из-за того, как вы написали ваше выражение EL (я не уверен на 100%):

<action onPostback="false">#{informesPerfilMB.load()}</action> 
                ^^ 

Примечание скобка на конец вашего выражения метода. Я считаю, что это заставит EL оценить метод, когда выражение оценивается. Ваше выражение метод должен выглядеть следующим образом:

<action onPostback="false">#{informesPerfilMB.load}</action> 

Вы должны также проверить другие места в приложении, где этот метод можно было бы назвать.

Пожалуйста, дайте мне знать, если это поможет.

+0

Хотя и не напрямую к ошибка, рекомендации, которые я оставил. Проблема заключалась в том, что у меня был компонент PrimeFaces-extension. например: pe: inputNumber. На этот раз он был вызван, volviar выполнил вызов страницы. Я не понимаю, почему, но уже решил. Спасибо за помощь. –

2

Я видел, как это происходило в моей подобной системе в прошлом. Я думаю, что это взаимодействие между лицами и поверхностями с отсутствующими файлами. Часть RES_NOT_FOUND поступает из сетевого трафика. Вероятно, у кого-то есть ресурс (или таблица стилей), который он пытается найти в библиотеках, а когда он не может, он по сути заставляет браузер перейти к URL-адресу /informes/RES_NOT_FOUND. По какой-то причине он часто обнаруживал этот ресурс, если обновлял страницу и не выдавал бы адрес RES_NOT_FOUND.

Во-первых, я бы открыл источник страницы, и вы найдете RES_NOT_FOUND, вероятно, вместе со стилями. Учитывая его положение, вы можете сопоставить его с ресурсами, загруженными в ваши xhtml-файлы, и посмотреть, какой из них отсутствует. Если это не помогает, попробуйте инструменты разработчика и посмотрите, какие ресурсы загружены, а какие нет. Затем убедитесь, что ресурс присутствует, развернут и находится в правильном месте.

Если это не то, что вы можете контролировать (например, ресурс библиотеки), вы всегда можете убедиться, что ваша функция setCodigo игнорирует значения «RES_NOT_FOUND».

public void setCodigo(String value) { 
    if (!"RES_NOT_FOUND".equals(value)) { 
    this.codigo = value; 
    } 
} 

Вы можете изменить параметры безопасности или сервлет-отображения (в WEB.XML), чтобы предотвратить URL-адреса, заканчивающиеся в RES_NOT_FOUND от попадания на страницы prettyfaces, но я не знаю достаточно об этом, чтобы сделать это.