JSTL c:使用数组设置bean属性,调用错误的setter方法

时间:2014-12-16 20:11:23

标签: java jsp jstl el

所以我使用<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”

为什么要这样做?我做错了什么?

感谢您的意见。

1 个答案:

答案 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, });
}