2014-01-15 4 views
1

я использую,PostConstruct вызывается дважды

  • JSF
  • Spring
  • OCPSoft Перепишите
  • Glassfish 4/Jetty 9

Я заметил, что мои бобы вызвать @PostConstruct ' s init() способ дважды. Вот пример компонента, который был инициализирован дважды, если вам понадобится web.xml или что-нибудь еще, просто опубликуйте его - у меня кончились идеи.

@ManagedBean(name = "userBean") 
public class UserBean implements Serializable { 

    private static final long serialVersionUID = -1347081883455053542L; 
    @ManagedProperty(value = "#{param.username}") 
    private String username; 
    private Users user; 
    private Authentication authentication; 
    private StreamedContent avatar; 

    @PostConstruct 
    public void init() { 
     System.out.println("userbean init and username: " + username); 
     user = Users.findByUsername(username); 
     authentication = SecurityContextHolder.getContext() 
       .getAuthentication(); 
     if (user == null) { 
      Navigator.redirect("/601"); 
      return; 
     } 
     if (user.isKeepPrivate() == true && !username.equals(authentication.getName())) { 
      Navigator.redirect("/600"); 
      return; 
     } 
     avatar = new DefaultStreamedContent(UserUtils.getAvatar(user), "image/png"); 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public StreamedContent getAvatar() { 
     return avatar; 
    } 

    public void setAvatar(StreamedContent avatar) { 
     this.avatar = avatar; 
    } 
} 
+1

Положите точку останова на метод и, когда он попал, внимательно прочитайте стек вызовов для подсказок. – BalusC

+1

Если вы настроили на управление вашими бобами Spring, аннотации, такие как '@ ManagedBean',' @ ManagedProperty', будут просто проигнорированы. Вместо этого вам нужно будет иметь эквивалентные аннотации Spring. – Tiny

+1

@ Tiny Здесь вы можете предположить, что bean управляется JSF, который также может обрабатывать '@ PostConstruct'. –

ответ

2

мы имеем эту проблему здесь, но проблема с WebSphere 6. (побег из WebSphere: D)

Итак ... мы делаем немного обходной путь, чтобы использовать @PostConstruct ...
может быть, может помочь вам ...

public boolean firstInit() { 
    boolean firstInit= false; 
     try { 
      FacesContext context = FacesContext.getCurrentInstance(); 
      firstInit= context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM); 
     } catch (Exception e) { 
      firstInit= false; 
     } 
     return firstInit; 
    } 
public void init(){ 
if (firstInit()) return; 
//init methods 
} 

И @PostConstruct method called twice for the same request это может помочь вам тоже ...

набл: я не могу писать комментарии:/

+0

Спасибо за ваш ответ, однако ваше решение не работает для меня. TBH это не будет большой проблемой на данный момент, но когда есть параметр запроса, то во втором вызове PostConstruct он всегда равен нулю –

+0

Я запустил приложение на Jetty 9, и init снова вызвался снова –

+0

Хм ... у вас есть другой class в init() с @postconstruct? И если вы используете Spring, почему вы не используете @Named вместо @ManagedBean? Попробуйте это тоже. 'код @Named @RequestScoped класс UserBean общественность реализует Serializable {} ' – xild