我有一个页面,其中有一个表格,其中包含指向编辑项目页面的链接
<h:dataTable rendered="#{cc.attrs.data.size() ne 0}" border="1" value="#{cc.attrs.data}" var="req">
<h:column>
<f:facet name="header">Тема</f:facet>
<h:link outcome="/pages/request" value="#{req.topic}">
<f:param name="reqId" value="#{req.id}"/>
</h:link>
</h:column>
...
编辑页面:
<f:metadata>
<f:viewParam name="reqId" value="#{requests.currentRequest}" converter="#{reqParamConverter}"/>
</f:metadata>
<center>
<h:panelGroup id="requestContent" style="text-align: left;display:block;max-width:450px;">
<h:outputText value="Автор: #{requests.currentRequest.customer.email}"/><br/>
... other fields
我的转换器是:
@Named("reqParamConverter")
@RequestScoped
public class RequestParamConverter implements Converter{
@Inject
private RequestBoundary boundary;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
... //null checks
Long id=Long.valueOf(value);
Request request= boundary.getRequest(id);
return request;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
... // null checks
Long id = ((Request) value).getId();
String result= (id!=null)? String.valueOf(id):null;
return result;
}
}
和支持bean:
@ManagedBean(name = "requests")
@RequestScoped
public class Requests {
private Request currentRequest;
... getters setters
问题是currentRequest
为空,在方法getAsString
的转换器中,Object value
参数为null;
因此,在页面上编辑所有字段都是空的
我没有看到那里有什么问题,我也试过@FacesConverter但是当我从BalusC文章中读到时,我不能使用@Inject
UPD:我通过为currentRequest字段添加getter方法来解决这个问题: 检查currentRequest是否为null然后我从请求URL获取参数(因为url仍然有?reqId = ..参数)然后从边界获取请求:
public Request getCurrentRequest() {
if(currentRequest==null) {
String param=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("reqId");
if(param!=null && !param.isEmpty()){
Long id=Long.valueOf(param);
currentRequest=boundary.getRequest(id);
}
else {
System.out.println("Request parameter is null");
}
}
return currentRequest;
}
但我不认为getter中的逻辑是个好主意:o