我的Seam代码出现问题,我似乎无法弄清楚我做错了什么。它正在我的脑袋:)这是一个堆栈跟踪的摘录:
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.oobjects.sso.manager.home.PresenceHome.customerId to java.lang.String
我正在尝试将我的URL上的参数设置传递到我的一个bean中。为此,我在pages.xml中进行了以下设置:
<page view-id="/customer/presences.xhtml">
<begin-conversation flush-mode="MANUAL" join="true" />
<param name="customerId" value="#{presenceHome.customerId}" />
<raise-event type="PresenceHome.init" />
<navigation>
<rule if-outcome="persisted">
<end-conversation />
<redirect view-id="/customer/presences.xhtml" />
</rule>
</navigation>
</page>
我的bean开头是这样的:
@Name("presenceHome")
@Scope(ScopeType.CONVERSATION)
public class PresenceHome extends EntityHome<Presence> implements Serializable {
@In
private CustomerDao customerDao;
@In(required = false)
private Long presenceId;
@In(required = false)
private Long customerId;
private Customer customer;
// Getters, setters and other methods follow. They return the correct types defined above
}
最后,我用来将一页链接到下一页的链接如下所示:
<s:link styleClass="#{selected == 'presences' ? 'selected' : ''}"
view="/customer/presences.xhtml" title="Presences" propagation="none">
<f:param name="customerId" value="#{customerId}" />
Presences
</s:link>
这一切似乎都很好。当我将鼠标悬停在我页面上方的链接上时,我会得到一个以“?customerId = 123”结尾的URL。因此参数被传递,并且它可以很容易地转换为Long类型。但由于某种原因,事实并非如此。我之前在其他项目中做过类似的事情,然后就可以了。我只是看不出它现在没有用的东西。
如果我从页面声明中删除该元素,我会很好地浏览页面。
那么,有没有人有任何想法?
答案 0 :(得分:7)
您想要在pages.xml文件中添加转换器。像这样:
<param name="customerId"
value="#{presenceHome.customerId}"
converterId="javax.faces.Long" />
有关详细信息,请参阅随seam提供的seampay示例。
答案 1 :(得分:0)
尝试:
...
<f:param name="customerId" value="#{customerId.toString()}" />
...
答案 2 :(得分:0)
我们的代码做了类似的事情,但是使用Java类中的 customerId 属性作为 String :
private String customerId;
public String getCustomerId() {
return customerId;
}
public void setCustomerId(final String customerId) {
this.customerId = customerId;
}
答案 3 :(得分:0)
您可以尝试使用属性编辑器。
将它放入与bean相同的包中:
import java.beans.PropertyEditorSupport;
public class PresenceHomeEditor extends PropertyEditorSupport {
public void setAsText(final String text) throws IllegalArgumentException {
try {
final Long value = Long.decode(text);
setValue(value);
} catch (final NumberFormatException e) {
super.setAsText(text);
}
}
}