Jakarta ee 如何从SelectOne菜单设置@ManyOne注释字段?

Jakarta ee 如何从SelectOne菜单设置@ManyOne注释字段?,jakarta-ee,jsf-2.2,jpa-2.1,Jakarta Ee,Jsf 2.2,Jpa 2.1,我有一个test.xhtml布局文件 . . . <h:form rendered="#{departmentBean.editEmployee}"> Employee name <h:inputText id="fullName" value="#{departmentBean.employee.fullName}" /> <h:selectOneMenu label="Department" value="#{departmentBean.emplo

我有一个test.xhtml布局文件

. . .
<h:form rendered="#{departmentBean.editEmployee}">
  Employee name
  <h:inputText id="fullName" value="#{departmentBean.employee.fullName}" />
  <h:selectOneMenu label="Department" value="#{departmentBean.employee.department}" converter="departmentConverter">
    <f:selectItems value="#{departmentBean.departmentList}" var="department" 
                   itemLabel="#{department.name}" itemValue="#{department}" />
  </h:selectOneMenu>
  <h:commandButton value="Save" action="#{departmentBean.save()}" />
</h:form>
. . .

所以我需要通过web表单在一些具体的员工中设置部门。要从SelectOneMenu组件转换输入值,反之亦然,我使用自定义转换器:

@FacesConverter("departmentConverter")
public class DepartmentConverter implements Converter {

  @EJB
  DepartmentEJB ejb;

  @Override
  public Object getAsObject(FacesContext context, UIComponent component, String value) {
    Department result = null;
    try {
        int id = Integer.parseInt(value);
        result = ejb.get(id);
    } catch (Exception e) {
      throw new ConverterException("Can't convert into Department string value: " + value);
    }
    return result;
  }

  @Override
  public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value instanceof Department) {
      return ((Department) value).getId() + "";
    }
    throw new ConverterException("Can't use departmentConverter for " + value.getClass().getName());
  }
}
但是,在提交表单时,我会看到验证错误消息

部门:验证错误:值无效

我为Department类编写了自定义验证器

@FacesValidator("departmentValidator")
public class DepartmentValidator implements Validator {

  @Override
  public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if ((value instanceof Department)) {
      Department dep = (Department)value;
      if (dep.getId() == 0) {
        FacesMessage msg = new FacesMessage("Department's id = 0!",
                "Department validation failed.");
        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
        throw new ValidatorException(msg);
      }
    } else {
        FacesMessage msg = new FacesMessage("Can't validate " + value.getClass().getName() + " as Department ",
                "Department validation failed.");
        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
        throw new ValidatorException(msg);
    }
  }
}
我确信验证值id是部门的实例。但我仍然得到验证错误,即该值无效

我可以提供一个详细的示例,说明如何正确设置souch字段的值吗?我错过了什么


谢谢你的回答,也谢谢你为我浪费时间。致以最诚挚的问候。

作为临时解决方案,我使用以下方法:

在Employee类中生成@Transient field departmentCode; 生成@PostLoad方法,将链接部门实例的id读入 部门代码; 在.xhtml表单中,设置departmentCode的值,而不是department; 在托管Bean的save方法中,通过departmentCode值获取Department实例; 将取数的部门实例设置为员工的部门属性; 有人知道更简单的方法吗

@FacesConverter("departmentConverter")
public class DepartmentConverter implements Converter {

  @EJB
  DepartmentEJB ejb;

  @Override
  public Object getAsObject(FacesContext context, UIComponent component, String value) {
    Department result = null;
    try {
        int id = Integer.parseInt(value);
        result = ejb.get(id);
    } catch (Exception e) {
      throw new ConverterException("Can't convert into Department string value: " + value);
    }
    return result;
  }

  @Override
  public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value instanceof Department) {
      return ((Department) value).getId() + "";
    }
    throw new ConverterException("Can't use departmentConverter for " + value.getClass().getName());
  }
}
@FacesValidator("departmentValidator")
public class DepartmentValidator implements Validator {

  @Override
  public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if ((value instanceof Department)) {
      Department dep = (Department)value;
      if (dep.getId() == 0) {
        FacesMessage msg = new FacesMessage("Department's id = 0!",
                "Department validation failed.");
        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
        throw new ValidatorException(msg);
      }
    } else {
        FacesMessage msg = new FacesMessage("Can't validate " + value.getClass().getName() + " as Department ",
                "Department validation failed.");
        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
        throw new ValidatorException(msg);
    }
  }
}