Неожиданное исключение поймало параметр «xxx» в «classе xxx: ошибка установки выражения« xxx »со значением

Я ModelDriven некоторые параметры classу действий, реализующему ModelDriven через строку запроса.

      Click  

Класс действия следующий.

 @Namespace("/admin_side") @ResultPath("/WEB-INF/content") @ParentPackage(value = "struts-default") public final class TestAction extends ActionSupport implements Serializable, Preparable, ModelDriven { 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 {} } 

Серверный терминал отображает следующие сообщения.

 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', ] 

Несмотря на то, что уровень журнала SEVERE , значения этих параметров доступны в classе действий как

 System.out.println(transporter.getTransporterId() + " : " + transporter.getTransporterName()); 

в методе edit() .

Если paramsPrepareParamsStack заменяется значением defaultStack то эти сообщения исчезают.

Выражения типа ['DHL', ] указывают на массив. transporterId и transporterName в модели, однако, имеют тип Long и String соответственно.

Что я делаю не так?

Здесь нет проблемы с массивом (даже если это так): этот вид исключения означает, что Struts не может найти Setter для вашего параметра:

Из документации ParametersInterceptor :

Предупреждение о недостающих параметрах

Если для данного имени параметра нет установленного устройства, в devMode будет регистрироваться предупреждающее сообщение, подобное приведенному ниже:

 SEVERE: Developer Notification (set struts.devMode to false to disable this message): Unexpected Exception caught setting 'search' on 'class demo.ItemSearchAction: Error setting expression 'search' with value ['search', ] Error setting expression 'search' with value ['search', ] - [unknown location] at com.opensymphony.xwork2.ognl.OgnlValueStack.handleRuntimeException(OgnlValueStack.java:201) at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:178) at com.opensymphony.xwork2.ognl.OgnlValueStack.setParameter(OgnlValueStack.java:152) 

Таким образом, ожидается поведение, позволяющее разработчику определять отсутствующий набор или опечатку в имени параметра или сеттера.

Вы можете легко воспроизвести эту ошибку, поместив элемент в JSP, который не существует в Action.

Поскольку ваши свойства существуют (с их сеттерами) в модели, и вы используете ModelDriven и paramsPrepareParamsStack , я думаю, что это происходит:

  • ModelDriven Interceptor делегирован для обработки объекта Model;
  • В первый раз, когда вы вызываете « Parameters Interceptor , ModelDriven Interceptor еще не запущен;
  • Затем ваше действие ничего не знает об объекте Model и попытайтесь найти Setters для ваших параметров в Action, NOT в модели.
  • Второй перехватчик запускается после модели ModelDriven и точно знает, где установить параметры. Вот почему вы правильно задали параметры в методе Action.

Но если это так, то вы НЕ должны быть в состоянии получить эти параметры в методе prepare() (именно по этой причине вы используете этот стек …):
попробуйте, и опубликуйте здесь результат.

Первое, что приходит мне на ум, чтобы решить эту проблему, – это ModelDriven Interceptor до первого Parameters Interceptor (путем его копирования или перемещения, я не уверен, какой побочный эффект, если он есть, может произвести в обоих случаях, вы должны снова попробовать и сообщить об этом здесь).

Затем определите следующий стек и используйте его.

          ^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*           ^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*    input,back,cancel,browse   input,back,cancel,browse   

Надеюсь, это поможет.

Interesting Posts
Давайте будем гением компьютера.