StackruError путем получения объекта из SelectOneMenu (компонент Primefaces)
У меня большая проблема, и за 3 дня я не могу ее решить. Проблема появляется, когда я пытаюсь получить объект, используя компонент SelectOneMenu. Это трассировка стека StackOverFlowException:
java.lang.StackruError
at java.util.Vector.listIterator(Vector.java:1103)
at java.util.AbstractList.equals(AbstractList.java:518)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
at org.eclipse.persistence.indirection.IndirectList.equals(IndirectList.java:396)
at java.util.Objects.equals(Objects.java:57)
at entity.MainCategory.equals(MainCategory.java:98)
at java.util.Objects.equals(Objects.java:57)
at entity.SubCategory.equals(SubCategory.java:121)
at java.util.AbstractList.equals(AbstractList.java:523)
at java.util.Vector.equals(Vector.java:981)
Это часть кода контроллера:
@ManagedBean
@SessionScoped
public class CategoriesControllerPanel implements Serializable{
@EJB
private MainCategoryDao mainCategoryDao;
@EJB
private SubCategoryDao subCategoryDao;
@EJB
private ProductDao productDao;
private Product product = new Product();
private List<Product> productList= new ArrayList<>();
private MainCategory mainCategory = new MainCategory();
private List<MainCategory> mainCategoryList = new ArrayList<>();
private SubCategory subCategory = new SubCategory();
private List<SubCategory> subCategoryList = new ArrayList<>();
@NotEmpty(message = "Wartość nie może być pusta")
private String newSubCategoryName=" " ;
@NotEmpty(message = "Wartość nie może być pusta")
private String newMainCategoryName=" " ;
private String[] mainCategoryNames;
private String oneSelectMenuName;
private MainCategory mainCategoryTmp;
@PostConstruct
public void start(){
get_MainCategoryList();
get_SubCategoryList();
subCategory = subCategoryDao.getSubCategoryById(1);
}
public void display(String i){
System.out.println("Test");
System.out.println(i);
}
это конвертер в MainCategory:
@ManagedBean
@ApplicationScoped
@FacesConverter("MainCategoryConverter")
public class MainCategoryMenuConverter implements Converter {
@EJB
private final MainCategoryDao service = null;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
try {
//Returns the item label of <f:selectItem>
//System.out.println("value = " + value);
if (value == null || value.isEmpty()) {
return null; // Let required="true" do its job on this.
}
int parsedValue = Integer.parseInt(value);
if (parsedValue <= 0) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Message"));
}
MainCategory entity = service.getMainCategoryById(parsedValue);
if (entity == null) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Message"));
}
return entity;
} catch (NumberFormatException e) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Message"), e);
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null) {
return ""; // Required by spec.
}
if (!(value instanceof MainCategory)) {
throw new ConverterException("Value is not a valid instance of SomeEntity.");
}
int id = ((MainCategory) value).getId();
String idString = "" + id;
return (idString != null) ? idString : "";
}
}
И простой пример в JSF Page:
<ui:define name="content">
<h:form>
<p:fieldset legend="Tutaj możesz zarządać transakcjami serwisu" style="margin-bottom:20px">
<h:panelGrid columns="3" cellpadding="5">
<h:outputText value="#{categoriesControllerPanel.subCategory.name}" escape="false"/>
<p:commandButton value="Zmień" onclick="PF('setMainCategoryDlg_#{categoriesControllerPanel.subCategory}').show()" icon="ui-icon-check" style="width: 70%"/>
<p:dialog header="Właściwości" widgetVar="setMainCategoryDlg_#{categoriesControllerPanel.subCategory}" modal="true" height="100" width="500" id="selectOneMenu">
<p:panelGrid columns="2" id="displayMenu" columnClasses="label,value">
<p:selectOneMenu id="setMainCategoryMenu" value="#{categoriesControllerPanel.mainCategoryTmp}" converter="#{mainCategoryMenuConverter}">
<f:selectItem itemLabel="#{categoriesControllerPanel.subCategory.mainCategory.name}"/>
<f:selectItems value="#{categoriesControllerPanel.mainCategoryList}" var="i" itemLabel="#{i.name}" itemValue="#{i}"/>
</p:selectOneMenu>
<p:commandButton value="Yes" icon="ui-icon-check" ajax="false" action="#{categoriesControllerPanel.display(categoriesControllerPanel.mainCategoryTmp)}" />
</p:panelGrid>
</p:dialog>
</h:panelGrid>
</p:fieldset>
</h:form>
</ui:define>
Проблема появляется, когда я выбираю основную категорию из меню и нажимаю кнопку отправки. экран:
Спасибо за быстрый ответ, но я никогда не использую равных там. Проблема появляется, когда я пытаюсь переопределить объект MainCategory. Пример смотри:
MainCategory mainCategoryTmp2 = mainCategoryDao.getMainCategoryByName("Ogrody"); // good
mainCategoryTmp = mainCategoryTmp2; // StackOverFlow Error
то же самое для:
MainCategory mainCategoryTmp2 = mainCategoryDao.getMainCategoryByName("Ogrody");
mainCategoryTmp = null;
mainCategoryTmp = mainCategoryTmp2;
Когда я отлаживаю, это выглядит так, что это переопределение oject хорошо, но после переопределения это время для stackOverFlow Error ... look:
Вы знаете, почему это происходит? (Я не могу ввести изображение здесь, потому что мне нужно 10 баллов репутации, поэтому я дал ссылки)
Хорошо. Я проверил это, и я нашел эти методы. Не могли бы вы сказать мне, как это исправить? Вот равных для главной категории:
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final MainCategory other = (MainCategory) obj;
if (!Objects.equals(this.id, other.id)) {
return false;
}
if (!Objects.equals(this.name, other.name)) {
return false;
}
if (!Objects.equals(this.subCategoryList, other.subCategoryList)) {
return false;
}
return true;
}
И это равно для подкатегории:
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final SubCategory other = (SubCategory) obj;
if (!Objects.equals(this.id, other.id)) {
return false;
}
if (!Objects.equals(this.name, other.name)) {
return false;
}
if (!Objects.equals(this.mainCategory, other.mainCategory)) {
return false;
}
if (!Objects.equals(this.productList, other.productList)) {
return false;
}
return true;
}
Существует отношение Один ко Многим:
-MainCategory имеет список подкатегорий
-SubCategory есть пул с MainCategory
Если ты можешь, пожалуйста, попытайся помочь мне:-)