2015-04-19 2 views
0

Я по-прежнему оставался в этой проблеме. Может кто-нибудь сказать мне, что я получаю неправильноНевозможно сохранить модель с отношением «многие ко многим»: форма возвращает ошибку проверки JSF: значение недействительно

Groupp.java

public class Groupp implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
    @Basic(optional = false) 
    @NotNull 
    private String name; 
    @Basic(optional = false) 
    @NotNull 
    private String description; 
    @JoinTable(name = "group_role", joinColumns = { 
     @JoinColumn(name = "group_id", referencedColumnName = "id", nullable = false)}, inverseJoinColumns = { 
     @JoinColumn(name = "role_id", referencedColumnName = "id", nullable = false)}) 
    @ManyToMany 
    private List<Role> roles; 
    //getters and setters 
} 

GroupController.java

@Named("groupController") 
@SessionScoped 
public class GroupController implements Serializable { 

    private Groupp current; 
    @EJB 
    private GroupFacade ejbFacade; 

    public GroupController() { 
    } 

    public Groupp getSelected() { 
     if (current == null) { 
      current = new Groupp(); 
      selectedItemIndex = -1; 
     } 
     return current; 
    } 

    public String createGroup() { 
     System.out.println("********Start Create Group***********"); 
     try { 
      getFacade.create(current); 

      return null; 
    } 


@FacesConverter(forClass = Groupp.class) 
public static class GrouppControllerConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext facesContext, UIComponent component, String value) { 
     System.out.println("Groupp::Submitted: String: "+value); 
     if (value == null || value.length() == 0) { 
      return null; 
     } 
     GroupController controller = (GroupController) facesContext.getApplication().getELResolver(). 
       getValue(facesContext.getELContext(), null, "grouppController"); 
     System.out.println("Groupp::Object of Submitted: String: "+controller.getGroupp(getKey(value))); 
     return controller.getGroupp(getKey(value)); 
    } 

    java.lang.Integer getKey(String value) { 
     java.lang.Integer key; 
     key = Integer.valueOf(value); 
     return key; 
    } 

    String getStringKey(java.lang.Integer value) { 
     StringBuilder sb = new StringBuilder(); 
     sb.append(value); 
     return sb.toString(); 
    } 

    @Override 
    public String getAsString(FacesContext facesContext, UIComponent component, Object object) { 
     if (object == null) { 
      return null; 
     } 
     if (object instanceof Groupp) { 
      Groupp o = (Groupp) object; 
      return getStringKey(o.getId()); 
     } else { 
      throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Groupp.class.getName()); 
     } 
    } 

} 

} 

RoleController.java

@Named("roleController") 
@SessionScoped 
public class RoleController implements Serializable { 

    private Role current; 
    @EJB 
    private RoleFacade ejbFacade; 
    public RoleController() { 
    } 

    public SelectItem[] getItemsAvailableSelectMany() { 
     for (Object x : ejbFacade.findAll()) { 
      items[i++] = new SelectItem(x, x.toString()); 
     } 
     return items; 
    } 

    @FacesConverter(forClass = Role.class) 
    public static class RoleControllerConverter implements Converter { 

     @Override 
     public Object getAsObject(FacesContext facesContext, UIComponent component, String value) { 
      System.out.println("Role::Submitted: String: "+value); 
      if (value == null || value.length() == 0) { 
       return null; 
      } 
      RoleController controller = (RoleController) facesContext.getApplication().getELResolver(). 
        getValue(facesContext.getELContext(), null, "roleController"); 
      System.out.println("Role::Object of Submitted: String: "+controller.getRole(getKey(value))); 
      return controller.getRole(getKey(value)); 
     } 

     java.lang.Integer getKey(String value) { 
      java.lang.Integer key; 
      key = Integer.valueOf(value); 
      return key; 
     } 

     String getStringKey(java.lang.Integer value) { 
      StringBuilder sb = new StringBuilder(); 
      sb.append(value); 
      return sb.toString(); 
     } 

     @Override 
     public String getAsString(FacesContext facesContext, UIComponent component, Object object) { 
      if (object == null) { 
       return null; 
      } 
      if (object instanceof Role) { 
       Role o = (Role) object; 
       return getStringKey(o.getId()); 
      } else { 
       throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Role.class.getName()); 
      } 
     } 

    } 

} 

create.jsp

<f:view> 
    <h:form id="groupForm"> 
     <h:inputText id="name" value="${groupController.selected.name}" /> 
     <h:inputText id="description" value="${groupController.selected.description}" /> 
     <h:selectManyListbox id="roles" value="${groupController.selected.roles}" > 
      <f:selectItems value="${roleController.itemsAvailableSelectMany}" var="role" itemValue="${role}" itemLabel="${role.label}" > 
     </h:selectManyListbox> 

     <b:commandButton action="${groupController.createGroup}" value="SAVE" /> 
    </h:form> 
</f:view> 

Каждый раз, когда я нажимаю кнопку SAVE, я получаю «groupForm: role: Validation Error: Value is not valid» и «******** Начать создание группы ********** *»никогда не печатается

+0

У вас есть другие страницы, которые отлично работают? (Меня беспокоит использование как jsp, так и $ вместо #, что не является стандартом для jsf 2.2) –

+0

да даже текущая страница сохраняется, если я не выбираю какую-либо роль. Но как только одна или несколько ролей выбраны, она не работает – Paullo

+0

У вас есть конвертер для роли? –

ответ

1

не могли бы вы попробовать его, как это вместо:

public List<Role> getItemsAvailableSelectMany() { 
    return roleFacade.findAll(); 
} 

<f:selectItems value="${groupController.itemsAvailableSelectMany}" 
       var="role" 
       itemValue="${role}" 
       itemLabel="${role.xxx}"/> 

(независимо от собственности, которую вы хотите показано от роли объекта в последней строке).

Плюс конвертер необходим, если есть сомнения this один кажется приятным.

+0

Спасибо за помощь @Jaque, но она до сих пор не решает проблему. Можете ли вы обновить мой пост, чтобы предоставить дополнительную информацию, которая может помочь – Paullo

+0

Является ли ошибка одинаковой? –

+0

Да, одна и та же ошибка - это то, что у меня есть – Paullo

 Смежные вопросы

  • Нет связанных вопросов^_^