请感谢您对此问题的帮助。我有一个带有抽象转换器的自动完成功能。通常,它运行良好,除非我使用验证器或f:验证器。当我将验证器放在自动完成时,它会转到通用转换器,但它不是返回对象,而是始终将id值放在自动完成输入中。通常,它通过放置对象并在itemLabel中引用类的属性来完成此流程。但只有当我放置一个验证器时,行为才是放入id,通过直接放入id来使系统不安全。可能是什么问题呢。
这是自动填充代码:
<p:autoComplete id="menuAutoComplete"
dropdown="true"
value="#{menuBean.entity.menu}"
var="menu"
itemLabel="#{menu.name}"
itemValue="#{menu}"
completeMethod="#{menuBean.completeMenu}"
converter="#{menuBean.converter}"
forceSelection="false"
required="#{menuBean.menuNeeded}"
size="100"
validator="menuValidator"
>
<p:ajax event="itemSelect"
listener="#{menuBean.handleSelectMenu}"
update="systemOutputLabel, systemOutputPanel, moduleOutputLabel, moduleOutputPanel"
oncomplete="PF('modulebui').show();PF('systembui').show()"
/>
这是通用或抽象的转换器:
public class GenericConverter implements Converter {
protected EntityService service;
@Autowired
public void setService(EntityService service) {
this.service = service;
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || value.length() == 0) {
return null;
}
Long id = Long.parseLong(value);
return service.find(id);
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return value instanceof BaseEntity ? ((BaseEntity) value).getId().toString() : "";
}
}
这是验证器:
@Component
@Scope("request")
@FacesValidator("menuValidator")
public class MenuValidator implements Validator {
@Autowired
UsuarioService usuarioService;
@Autowired
MessagesController messagesController;
@Override
public void validate(FacesContext fc, UIComponent uic, Object value) throws ValidatorException {
if(value == null){
return;
}
Menu menu = (Menu) value;
if(menu.getNombre().equals("Menu1") ){
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "test error",
"test error");
throw new ValidatorException(msg);
}
}
}
提前感谢,