2014-11-29 4 views
1

Я попытался сделать такой же список, как и в приведенной ниже ссылке: http://www.primefaces.org/showcase/ui/input/listbox.xhtmlОшибка проверки selectOneListbox. Entity @OneToOne отношения

К сожалению, я получаю сообщение об ошибке проверки:

Select Box: Validation Error: Value is not valid 

Я не знаю, где я сделал ошибку. Я много читал об этой проблеме (в большинстве случаев она была решена BalusC), однако все еще не может найти проблему.

Если вы можете помочь, я действительно ценю.

StoreHouse.java

@Entity 
public class StoreHouse implements Serializable { 

@Id 
@GeneratedValue 
private Integer id; 

@OneToOne 
private Supply supply; 

@Column(nullable = false) 
private Integer amount; 
//geters setters namedqueryies 

Supply.java

@Entity 
public class Supply implements Serializable { 

@Id 
@GeneratedValue 
private Integer id; 

@Column(unique = true, nullable = false, length = 32) 
private String name; 

@Column(length = 1024) 
private String description; 

@Column 
private Double price; 

@Enumerated(EnumType.STRING) 
@NotNull 
private SupplyType supplyType; 
//geters setters namedqueryies 

StoreHouseController.java

@ManagedBean 
public class StoreHouseController implements Serializable { 

@Inject 
private StoreHouseBean storeHouseBean; // DAO for storeHouse 

@ManagedProperty("#{supplyController}") 
private SupplyController supplyController; //Manged bean for Supply 

private StoreHouse storeHouse = new StoreHouse(); 
private List<Supply> allSupplies; 

@PostConstruct 
public void init() { 
    allSupplies = supplyController.findAll(); 
} 

public void check() { 
    System.out.println("storeHousetheme" + storeHouse.toString()); // Function just to check if the supply was set 
} 

SupplyConverter.java

@FacesConverter("supplyConverter") 
public class SupplyConverter implements Converter { 

@Override 
public Object getAsObject(FacesContext context, UIComponent component, String value) { 

    if (value != null && value.trim().length() > 0) { 

     try { 
      SupplyController supplyController = (SupplyController) context.getExternalContext().getApplicationMap().get("supplyController"); 
      Supply supply = supplyController.findById(Integer.parseInt(value)); 
      System.out.println("CONVERTER:" + supply.toString()); 
      return supply; 
     } catch (NumberFormatException e) { 
      throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion error", "ERROR.")); 
     } 
    } else { 
     return null; 
    } 
} 

@Override 
public String getAsString(FacesContext context, UIComponent component, Object object) { 
    if (object != null) { 
     return String.valueOf(((Supply) object).getId()); 
    } else { 
     return null; 
    } 
} 
} 

view.xhtml

<h:form> 
<p:messages autoUpdate="true" /> 
<h:panelGrid columns="2"> 
    <h:outputLabel value="Nazwa" /> 
    <p:selectOneListbox id="supplies" value="#{storeHouseController.storeHouse.supply}" converter="supplyConverter" var="s" filter="true" label="Select Box"> 
     <f:selectItems value="#{storeHouseController.allSupplies}" var="supply" itemLabel="#{supply.name}" itemValue="#{supply}"/> 
     <p:column> 
      <h:outputText value="#{s.name}" /> 
     </p:column> 
    </p:selectOneListbox> 
    <p:commandButton action="#{storeHouseController.check}" type="submit" value="submit" /> 
</h:panelGrid> 

Если вам нужен любой другой файл/класс, пожалуйста, просто добавьте комментарий.

ответ

0

После нескольких дней поиска и поиска в Интернете я нашел решение. Я немного сержусь, что это нигде не размещается на перформансах, потому что я потерял много часов, чтобы исправить эту проблему.

Вышло, что я не перезаписал equals метод Supply класс, который требуется.

@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    final Supply other = (Supply) obj; 
    if (!Objects.equals(this.id, other.id)) { 
     return false; 
    } 
    if (!Objects.equals(this.name, other.name)) { 
     return false; 
    } 
    if (this.supplyType != other.supplyType) { 
     return false; 
    } 
    return true; 
} 

Я считаю, что эта тема поможет кому-то в будущем ...

0

Ваше значение SelectItem является вашим объектом, поэтому вызывается метод toString() - и вы получаете что-то вроде «Supply @ 44de6bae». Затем ваш контроллер пытается разобрать его на int и не удается. Попробуйте ...

<f:selectItems value="#{...}" var="..." itemLabel="..." itemValue="#{supply.id}"/> 

Если встретилась ошибка при загрузке страницы, это может помочь, а также по крайней мере, некоторые компоненты не любят значения «или-перечисление не имеет основного типа». Надеюсь, это помогло, Greez.

+0

'java.lang.Integer не может быть приведен к pl.gw.model.Supply' – Silwest

+0

когда? в каком классе? – Dawn

+0

После изменения itemvalue на supply.id. На мой взгляд, у нас должен быть объект не целочисленный. – Silwest

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