I'm passing some parameters to an action class implementing ModelDriven<Transporter>
through a query-string.
<s:form namespace="/admin_side" action="Test" id="dataForm" name="dataForm">
<s:url id="editURL" action="EditTest" escapeAmp="false">
<s:param name="transporterId" value="1"/>
<s:param name="transporterName" value="'DHL'"/>
</s:url>
<s:a href="%{editURL}">Click</s:a>
</s:form>
The action class is as follows.
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
public final class TestAction extends ActionSupport
implements Serializable, Preparable, ModelDriven<Transporter>
{
private static final long serialVersionUID = 1L;
private Transporter transporter = new Transporter();
@Action(value = "Test",
results = {
@Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs = {
@InterceptorRef(value = "paramsPrepareParamsStack",
params = {"params.acceptParamNames", "transporterId, transporterName"})})
public String load() throws Exception {
return ActionSupport.SUCCESS;
}
@Action(value = "EditTest",
results = {
@Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs = {
@InterceptorRef(value = "paramsPrepareParamsStack",
params = {"params.acceptParamNames", "transporterId, transporterName"})})
public String edit() {
System.out.println(transporter.getTransporterId()
+ " : " + transporter.getTransporterName());
return ActionSupport.SUCCESS;
}
@Override
public Transporter getModel() {
return transporter;
}
@Override
public void prepare() throws Exception {}
}
The server terminal displays the following messages.
Jan 09, 2014 4:06:32 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor error
SEVERE: Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'transporterId' on 'class actions.TestAction: Error setting expression 'transporterId' with value ['1', ]
Jan 09, 2014 4:06:32 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor error
SEVERE: Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'transporterName' on 'class actions.TestAction: Error setting expression 'transporterName' with value ['DHL', ]
Even though the log level is SEVERE
, the values of these parameters are available in the action class as
System.out.println(transporter.getTransporterId()
+ " : " + transporter.getTransporterName());
in the edit()
method.
If paramsPrepareParamsStack
is replaced by defaultStack
then, these messages disappear.
Expressions like ['DHL', ]
indicate an array. transporterId
and transporterName
in the model are, however of type Long
and String
respectively.
What am I doing wrong?
In the code that you have given, I can't find the declaration of the Transporter Class.
So I guess that maybe it is because your Transpoter class has more parameters than 2, not just id and name.
In fact, this error message always occurred on the situation I mentioned.
To solve this problem, you can define a data transport object(DTO) which only has 2 attributes,id and name. Use this DTO to accept parameters from the jsp, and then pass the attributes value to the Transporter object.
I see this problems in 2019, and offer a solution, hoping that it can be of use by others in the future.
No array problem is involved here (even if it seems like that): this kind of exception means that Struts can't find a Setter for your parameter:
From ParametersInterceptor documentation:
You can easily reproduce this error by putting an element in JSP that does not exist in the Action.
Since your properties exist (with their Setters) in the Model, and you are using
ModelDriven
andparamsPrepareParamsStack
, what I think is going on is:ModelDriven Interceptor
is delegated to handle the Model object;Parameters Interceptor
,ModelDriven Interceptor
has not run yet;But if this is true, then you should NOT be able to retrieve those parameters in the
prepare()
method (that is the reason you are using this stack...):please try, and post here the result.
The first thing that comes to my mind to resolve this issue, is to place the
ModelDriven Interceptor
before the firstParameters Interceptor
(by either copying it, or by moving it, I'm not sure which kind of side effect, if any, it could produce in both cases, you should again try and reporting it here).Then define the following stack, and use it.
Hope that helps.