В настоящее время я просматриваю код и нашел преобразователи CDI, такие как:
@Named
@RequestScoped
public class BankConverter implements Converter, Serializable
{
@EJB
private BankService bankService;
@Override
public Object getAsObject( FacesContext ctx, UIComponent comp, String identifier )
{
if ( identifier == null || identifier.trim().isEmpty() )
{
return null;
}
Bank bank = null;
try
{
bank = this.bankService.findByPrimaryKey( Long.valueOf( identifier ) );
}
catch( Exception e )
{
// omitted
}
return bank;
}
@Override
public String getAsString( FacesContext ctx, UIComponent comp, Object obj )
{
if ( obj == null || ( ( Bank ) obj ).getId() == null )
{
return null;
}
return ( ( Bank ) obj ).getId().toString();
}
}
Преобразователи в основном всегда используются так (обратите внимание на converter="#{bankConverter}"
):
<p:autoComplete id="bank"
value="#{employeeDepotManager.selectedBank}"
var="bnk"
converter="#{bankConverter}"
completeMethod="#{autoCompleter.completeBankSearch}"
itemLabel="#{bnk.name}"
itemValue="#{bnk}"
forceSelection="false"
minQueryLength="3"
global="true"
validator="#{employeeDepotManager.validateBank}"
scrollHeight="200">
<p:ajax event="itemSelect" update="bank-code bank-name" />
<p:column>#{bnk.code}</p:column>
<p:column>#{bnk.name}</p:column>
</p:autoComplete>
В настоящее время я обсуждаю с коллегой, какая область будет лучше для конвертеров...
95% bean-компонентов менеджера, на которые ссылаются страницы JSF, имеют @ViewScoped
, и поэтому я подумал, что было бы лучше, чтобы преобразователи также были @ViewScoped
(вместо @RequestScoped, который, насколько я понимаю, воссоздает экземпляр преобразователя для каждого запроса AJAX) .
Затем мой коллега добавил, что преобразователь, вероятно, должен быть @Dependent
, так как это автоматически поместит преобразователи в область, в которой находятся окружающие компоненты. Я чувствовал, что это не сработает. Тем не менее, я не мог не согласиться, поскольку мои знания в значительной степени заканчиваются здесь.
Итак, что вероятно было бы наилучшей областью действия для преобразователей, когда почти все bean-компоненты, на которые ссылается JSF, являются @ViewScoped
?
PS: обратите внимание, что мы используем шов 3, чтобы смешать @Named
и @ViewScoped
.