Область просмотра шире, чем область запроса.@ManagedProperty
может устанавливать только те свойства, которые имеют ту же или более широкую область действия по сравнению с областью действия управляемого компонента.
Просто продолжайте использовать <f:viewParam>
с <f:event>
.Вы не должны только вкладывать их друг в друга.
<f:metadata>
<f:viewParam name="id" value="#{bookBean.id}" />
<f:event type="preRenderView" listener="#{bookBean.init}" />
</f:metadata>
с
@ManagedBean
@ViewScoped
public class BookBean implements Serializable {
private String id;
public void init() {
if (id != null) {
currentBook = bookService.find(id);
}
}
// ...
}
<f:viewParam>
установит параметр запроса, а <f:event>
выполнит метод слушателя после установкииз этих параметров.
@PostConstruct
прекрасно работает и на bean-объектах видимости, но он запускается только после построения bean-компонента и установки всех зависимостей (например, @ManagedProperty
, @EJB
, @Inject
, @Resource
и т. Д.).Однако <f:viewParam>
устанавливает свойство после этого, поэтому оно не доступно в @PostConstruct
.