I am aware that, when applying request parameters to an action, Struts
cannot guess the actual type of parameters determined by a generic type
(because of erasure at compile time).
However, I am assuming that if a non-generic action class extends an
abstract generic one, it should be possible in the non-generic child to
force the type conversion explicitely. Isn't that the case? At the moment,
I seemingly cannot get Struts to realize that I did specify a type
conversion and I keeping getting the following exception (whether my forced
conversion is in place or not):
java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to
java.lang.Integer
Underneath are the relevant parts of my setup.
*What am I forgetting?* (For example, am I missing an interceptor
somewhere?)*
Can anyone suggest how to trace what's happening at the point when a
converter should be applied (and is clearly not)?
*
In web.xml, I specify the location of the action package:
<filter>
<filter-name>action2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>com.mywebapp.actions2</param-value>
</init-param>
</filter>
In struts.xml, here's the bit about the concrete (non-generic) child:
<package name="contrib" extends="struts-default" abstract="false"
namespace="/contrib" >
<interceptors>
<interceptor name="autoLogin"
class="com.mywebapp.interceptors.AutoLoginInterceptor" />
<interceptor-stack name="contribStack">
<interceptor-ref name="autoLogin"/>
<interceptor-ref name="paramsPrepareParamsStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="contribStack" />
<action name="groupContrib" class="groupContribAction">
<result>/struts2/groupContrib2.jsp</result>
</action>
</package>
The previous reference to "groupContribAction" is in fact a Spring bean:
<bean id="groupContribAction"
class="com.mywebapp.actions2.GroupContribAction"
parent="abstractContribAction" scope="prototype">
<property name="contrib" ref="groupContrib" />
<property name="contribService" ref="groupContribService" />
</bean>
Here is an excerpt of the concrete action class itself. Notice the
conversion annotations. (I also half-heartedly tried without annotations,
using instead GroupContribAction-conversion.properties.)
@Conversion
public class GroupContribAction extends ContribAction<Integer> {
private Integer propertyId;
@Override
public Integer getPropertyId() { return propertyId; }
@Override
@TypeConversion(converter =
"com.mywebapp.converters.StringToIntegerConverter")
public void setPropertyId(Integer propertyId) { this.propertyId =
propertyId; }
}
And finally, here is an excerpt of the abstract generic parent:
public abstract class ContribAction<K extends Serializable>
extends ActionSupport implements ServletRequestAware, Preparable
{
public abstract void setPropertyId(K propertyId);
public abstract K getPropertyId();
}