Roman C Roman C - 1 month ago 14
Java Question

Suppress empty parameters using param tag

I have written JSP that I used with many actions. It has a link with parameters

The link:

<s:a namespace="/some" action="view">
<s:param name="purpose" value="%{purpose}"/>
<s:param name="type" value="%{type}"/>
<s:property value="%{name}"/>
</s:a>


The action class:

public class ViewAction extends ActionSupport {

private Long purpose;
private Long type;
private String name;

public Long getPurpose() {
return purpose;
}

public void setPurpose(Long purpose) {
this.purpose = purpose;
}

public Long getType() {
return type;
}

public void setType(Long type) {
this.type = type;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}


Usually I initialize both parameters, but sometimes one parameter is
null
. So, the link is generated with
href
like

/context/some/view?purpose=1&type=


but I want to remove
&type=


I tried an example from Param Examples.

<s:a namespace="/some" action="view">
<s:param name="purpose" value="%{purpose}"/>
<s:param name="type" value="%{type}"/>
<s:property value="%{name}"/>
<s:param name="suppressEmptyParameters" value="true"/>
</s:a>


but it didn't work

I also tried

<s:a namespace="/some" action="view">
<s:param name="purpose" value="%{purpose}"/>
<s:param name="type" value="%{type}" suppressEmptyParameters="true"/>
<s:property value="%{name}"/>
</s:a>


and I got

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
at org.apache.struts2.components.Param.end(Param.java:129)
at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)


How to solve this problem?

Answer

Well that line <s:param name="suppressEmptyParameters" value="true"/> doesn't make sense, and it should be removed from the <s:param> docs.

The <s:param name="type" value="%{type}" suppressEmptyParameters="true"/> is correct way of suppressing empty parameters and it isn't working with not String-s because of the bug WW-4275.

Meanwhile, until the next version is released, you can use toString() method to avoid ClassCastException exception.

<s:param name="type" value="type.toString()" suppressEmptyParameters="true"/>