된 invoke 내가 유효성 검사를 결합하고 userId
Player
로 변환하려고이 f:viewParam
이있을 때, 그리고 나는 예상치 못한 결과를 얻었다. 이F : viewParam 변환기 및 ViewScoped 예외 밖으로는 두 번째 아약스 요청
@FacesConverter(value="pConverter")
public class PConverter implements Converter {
private static final List<Player> playerList;
static{
playerList = new ArrayList<Player>();
playerList.add(new Player(1, "Harry"));
playerList.add(new Player(2, "Tom"));
playerList.add(new Player(3, "Peter"));
}
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if(value == null || !value.matches("\\d+")){
return null;
}
long id = Long.parseLong(value);
for(Player p : playerList){
if(p.getId() == id){
return p;
}
}
throw new ConverterException(new FacesMessage("Unknown userId: " + value));
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object value) {
if(!(value instanceof Player) || value == null){
return null;
}
return String.valueOf(((Player)value).getId());
}
}
같은
<f:metadata>
<f:viewParam name="userId" value="#{myBean.selectedPlayer}" converter="pConverter"
converterMessage="Bad Request. Unknown User" required="true"
requiredMessage="Bad Request. Please use a link from within the system" />
</f:metadata>
<h:body>
<p:messages id="msgs"/>
<h:form>
<ul>
<li><a href="index2.xhtml?userId=1">Harry</a></li>
<li><a href="index2.xhtml?userId=2">Tom</a></li>
<li><a href="index2.xhtml?userId=3">Peter</a></li>
</ul>
</h:form>
<h:form>
<h:panelGrid columns="2" rendered="#{not empty myBean.selectedPlayer}">
<h:outputText value="Id: #{myBean.selectedPlayer.id}"/>
<h:outputText value="Name: #{myBean.selectedPlayer.name}"/>
</h:panelGrid>
</h:form>
<h:form id="testForm">
<h:inputText value="#{myBean.text}"/>
<p:commandButton value="Switch" update=":msgs testForm"/>
<h:outputText value="#{myBean.text}" rendered="#{not empty myBean.text}"/>
</h:form>
</h:body>
내 개종 보면 나는 세 개의 링크 (해리, 톰, 피터), 큰 컨버터 작업을 클릭한다. 그것은 id를 변환하고 player
을 다시 내 관리 Bean에 바인드합니다. 그런 다음 입력란에 무언가를 입력 한 다음 Switch
을 처음 클릭하면 입력 한 내용이 버튼 옆에 나타나지만 입력 한 내용이 변경되고 Switch
을 다시 클릭하면 오류 메시지가 나타납니다. Bad Request. Please use a link from within the system
f:viewParam
에 대한 required
의 오류 메시지 f : viewParam을 꺼내면 모든 것이 잘 작동합니다. 놀랍게도, 내가 f : viewParam에서 o : viewParam (OmniFaces)으로 전환한다면, 그것은 훌륭하게 작동합니다.
대단히 감사합니다. Omnifaces는 매우 훌륭합니다, BalusC. 귀하의 블로그에 'o : viewParam'에 관한 한 가지 질문이 있는데, Ajax 요청이 호출 될 때마다 omnifaces가'Converter '호출을 피할 것이라고 말했지만, 항상 getAsString() 메소드 내부에있는 것처럼 보입니다. 그래서이 행동이 올바른지 궁금합니다. 나는'getAsObject'가 모델 값을 설정한다는 것을 알고 있으므로'getAsObject'를 호출하지 않는 것이 큰 발전입니다. 그리고 고마워요. –
객체를 문자열로 변환해야 할 때 (생성 된 HTML에 표시하기 위해)'getAsString()'이 호출됩니다. 그러나 이미 속성 중 하나의 문자열 값으로 간주되기 때문에 다소 싼 작업이어야합니다. 이 시점에서 이미 객체를 손에 쥐고 있기 때문에 값 비싼 DB 작업이 필요하지 않습니다. – BalusC
고맙습니다. –