所以我使用<c:set>
来设置对象的值。问题是有两个具有相同名称的setter方法,正在调用错误的方法。
在我的JSP中我有这个:
<c:when test="${not empty paramValues.tag }">
<c:set target="${listing }" property="tags" value="${paramValues.tag }" />
</c:when>
现在,我们知道${paramValues.tag}
是这里定义的字符串数组(http://docs.oracle.com/javaee/1.3/api/javax/servlet/ServletRequest.html#getParameterValues(java.lang.String))。
我已通过输出${paramValues.tag}
验证了这一点,并且能够使用foreach循环<c:forEach var="test" items="${paramValues.tag}">
在我的java类中,我有以下内容:
public void setTags(final String tagName) {
LOG.debug("Setting tags from single tag string");
this.setTags(Arrays.asList(tagName));
}
public void setTags(final String[] tagNames) {
LOG.debug("Settings tags from tag array");
this.setTags(Arrays.asList(tagNames));
}
我看到的结果是调用日志消息“从单个标记字符串设置标记”。 所以c:set调用setTags(String)方法而不是setTags(String [])方法。 传递的“tagName”参数是“[Ljava.lang.String; @ 73f9e088”
为什么要这样做?我做错了什么?
感谢您的意见。
答案 0 :(得分:1)
&#34;属性的概念&#34;是你有一个getter和setter,其中getter的返回类型与setter的参数类型相同。
所以在这种情况下,&#34;属性检查员&#34;可能推导出一个属性为String而不是String []的属性tagNames,事实上还有一个带字符串数组的setter并不重要。
建议:引入一个接受String的setTag和接受字符串数组的setTags。
注意,属性概念不需要属性:在这种情况下,setTag可以实现为
public void setTag(String tag) {
setTags(new String[] { tag, });
}