ric*_*ich 4 java jsf jboss mojarra jboss6.x
我知道这似乎是一个普通的,但我迷失了它.单击assessment.jsf中的"添加"按钮时发生.无论如何,我已经附上我认为相关的部分.
我调试时没有触发FWIW,AssessmentType.equals().
提前致谢.
j_idt38:j_idt47:j_idt48: Validation Error: Value is not valid
Run Code Online (Sandbox Code Playgroud)
assessment.xhtml:
<h:form>
<h:selectOneMenu value="#{assessmentBean.assessmentField}">
<f:selectItems value="#{assessmentBean.assessment.type.fields}" />
</h:selectOneMenu>
<h:commandButton value="Add" action="#{assessmentBean.doAddField}">
<f:param name="assessmentId"
value="#{assessmentBean.assessment.id}" />
</h:commandButton>
</h:form>
Run Code Online (Sandbox Code Playgroud)
assessment.jsf:
<form id="j_idt38:j_idt47" name="j_idt38:j_idt47" method="post" action="/jsf-web/edit/assessment.jsf" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt38:j_idt47" value="j_idt38:j_idt47" />
<select name="j_idt38:j_idt47:j_idt48" size="1"> <option value="1">Presenting Condition</option>
<option value="2">Problem Duration</option>
</select>
<script type="text/javascript" src="/jsf-web/javax.faces.resource/jsf.js.jsf?ln=javax.faces"></script>
<input type="submit" name="j_idt38:j_idt47:j_idt50" value="Add" onclick="mojarra.jsfcljs(document.getElementById('j_idt38:j_idt47'),{'j_idt38:j_idt47:j_idt50':'j_idt38:j_idt47:j_idt50','assessmentId':'1'},'');return false" /><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="3431661972220941645:6952134510589038883" autocomplete="off" />
</form>
Run Code Online (Sandbox Code Playgroud)
AssessmentType.java:
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;
import lombok.Data;
import org.hibernate.envers.Audited;
@Audited
@Data
@Entity
public class AssessmentType implements Comparable<AssessmentType> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
private String name;
@OneToMany( fetch=FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity=AssessmentField.class )
private List<AssessmentField> fields;
@Override
public int compareTo(final AssessmentType o) {
return getId().compareTo(o.getId());
}
@Override
public String toString() {
return getName();
}
}
Run Code Online (Sandbox Code Playgroud)
AssessmentFieldConverter.java
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.htu.fizio.api.AssessmentFieldManager;
import com.htu.fizio.domain.AssessmentField;
@FacesConverter(forClass = AssessmentField.class)
public class AssessmentFieldConverter implements Converter {
AssessmentFieldManager<AssessmentField> assessmentFieldManager;
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
try {
final InitialContext ic = new InitialContext();
assessmentFieldManager = (AssessmentFieldManager) ic.lookup("fizio/AssessmentFieldManagerImpl/local");
return assessmentFieldManager.find(Long.valueOf(value));
} catch (NamingException e) {
e.printStackTrace();
}
return null;
}
@Override
public String getAsString(FacesContext ctx, UIComponent component, Object value) {
return String.valueOf(((AssessmentField) value).getId());
}
}
Run Code Online (Sandbox Code Playgroud)
AssessmentBean.java
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import lombok.Getter;
import lombok.Setter;
import com.htu.fizio.api.AssessmentManager;
import com.htu.fizio.domain.Assessment;
import com.htu.fizio.domain.AssessmentField;
import com.htu.fizio.domain.AssessmentFieldValue;
import com.htu.fizio.jsf.faces.FacesUtil;
...
@PostConstruct
public void init() {
if (FacesUtil.containsKey("assessmentId")) {
final Long id = Long.parseLong(FacesUtil.get("assessmentId"));
assessment = assessmentManager.find(id);
} else {
assessment = new Assessment();
}
}
public String doAddField() {
final AssessmentFieldValue value = new AssessmentFieldValue();
value.setField(assessmentField);
value.setValue("");
assessment.getFieldValues().add(value);
assessmentManager.save(assessment);
return "/edit/assessment";
}
Run Code Online (Sandbox Code Playgroud)
编辑:
调试时注意到这一点,是否可能是怀疑?:
Daemon Thread [HandshakeCompletedNotify-Thread] (Suspended (exception ConcurrentModificationException))
HashMap$EntryIterator(HashMap$HashIterator<E>).nextEntry() line: 793
HashMap$EntryIterator.next() line: 834
HashMap$EntryIterator.next() line: 832
SSLSocketImpl$NotifyHandshakeThread.run() line: 2214
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 15
验证错误:值无效
到目前为止,此错误表示所选项目与列表中的任何可用项目都不匹配.即,所选项目值表示的对象从未true在其equals()调用中返回任何可用的选择项目.
导致此问题的原因只有两个:
equals()问题的对象类型的方法被破坏了.由于第一个似乎是正确实施的 - 按照评论 - ,唯一的原因是第二个.假设你在getter方法中没有进行业务逻辑,一个简单的测试就是把它#{assessmentBean}放在会话范围内.如果它工作,那么选择项列表的数据(预)加载逻辑肯定是错误的.
验证失败,因为在您的转换器将AssessmentType的String表示形式转换回对象后,JSF将迭代现有值(assessmentBean.assessment.type.fields)并将此最近转换的对象与所有现有对象进行比较.
由于您没有Object#equals为AssessmentType 实现,它将默认为对象标识比较(粗略地说,对象的内存地址),这当然会失败.
解决的办法是这样要么执行Object#equals,要么让转换器从得到的对象assessmentBean.assessment.type.fields,而不是从AssessmentTypeManager.
| 归档时间: |
|
| 查看次数: |
16387 次 |
| 最近记录: |