Я пишу REST-сервер, используя struts2-rest-plugin. Я тестирую вызовы REST с помощью SoapUI и Postman. Я следую примеру кода здесь:
https://cwiki.apache.org/confluence/display/WW/REST+Plugin
Мои вызовы REST для controller.index()
) и controllers.create()
работают нормально.
Но, хотя controller.update()
успешно вызывает контроллер и обновляет запись:
19:46:05.361 [http-nio-8080-exec-3] DEBUG com.opensymphony.xwork2.validator.ValidationInterceptor - Validating /contacts with method update.
19:46:05.393 [http-nio-8080-exec-3] DEBUG com.opensymphony.xwork2.DefaultActionInvocation - Executing action method = update
19:46:05.398 [http-nio-8080-exec-3] DEBUG com.opensymphony.xwork2.ognl.SecurityMemberAccess - Checking access for [target: com.example.contactsapp.controllers.ContactsController@7e69160c, member: public java.lang.String com.example.contactsapp.controllers.ContactsController.update(), property: null]
19:46:07.862 [http-nio-8080-exec-3] DEBUG com.example.contactsapp.controllers.ContactsController - Updating existing contact(97)...
...
... происходит сбой при возврате, с этой ошибкой:
...
19:46:11.380 [http-nio-8080-exec-3] WARN org.apache.struts2.dispatcher.Dispatcher - Could not find action or result: /StrutsContactsApp/contacts/97
com.opensymphony.xwork2.config.ConfigurationException: No result defined for action com.example.contactsapp.controllers.ContactsController and result update
at org.apache.struts2.rest.RestActionInvocation.findResult(RestActionInvocation.java:283) ~[struts2-rest-plugin-2.5.22.jar:2.5.22]
at org.apache.struts2.rest.RestActionInvocation.executeResult(RestActionInvocation.java:225) ~[struts2-rest-plugin-2.5.22.jar:2.5.22]
at org.apache.struts2.rest.RestActionInvocation.processResult(RestActionInvocation.java:189) ~[struts2-rest-plugin-2.5.22.jar:2.5.22]
at org.apache.struts2.rest.RestActionInvocation.invoke(RestActionInvocation.java:137) ~[struts2-rest-plugin-2.5.22.jar:2.5.22]
at com.opensymphony.xwork2.DefaultActionProxy.execute(DefaultActionProxy.java:157) ~[struts2-core-2.5.22.jar:2.5.22]
...
Вот контроллер:
public class ContactsController implements ModelDriven<Object> {
private static final Logger log = LogManager.getLogger(ContactsController.class);
private String id;
private Contact model = new Contact();
private Collection<Contact> list;
private ContactsRepository contactsRepository = new ContactsRepositoryImpl();
@Override
public Object getModel() {
return (list != null ? list : model);
}
public void setId(String id) {
if (id != null) {
int contactId = Integer.parseInt(id);
this.model = contactsRepository.getContact(contactId);
}
this.id = id;
}
public HttpHeaders index () {
log.debug("Reading all contacts...");
list = contactsRepository.getContacts();
return new DefaultHttpHeaders("index").disableCaching();
}
...
// PUT /orders/1
public String update() {
log.debug("Updating existing contact(" + id + ")...", model);
contactsRepository.updateContact(model);
return "update";
}
...
... и распорки. xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.mapper.class" value="rest" />
<constant name="struts.convention.action.suffix" value="Controller"/>
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<constant name="struts.convention.default.parent.package" value="rest-default"/>
<constant name="struts.convention.package.locators" value="controllers"/>
<package name="contacts" extends="rest-default">
<global-allowed-methods>index,show,create,update,destroy,deleteConfirm</global-allowed-methods>
</package>
</struts>
Ничего не работало, прежде чем я добавил <package name="contacts">
. Я пробовал несколько разных вариантов добавления <action>
и <result>
, но безрезультатно.
Примеры URL:
GET Endpoint= http://localhost:8080, Resource= /StrutsContactsApp/contacts.json
: OK POST Endpoint= http://localhost:8080, Resource= /StrutsContactsApp/contacts.json + JSON body
: OK PUT Endpoint= http://localhost:8080, Resource= http://localhost:8080, + JSON body
:
Вызов API успешен, браузер получает «HTTP 404»; В журнале говорится: «Не определен результат для действия com.example.contactsapp.controllers.ContactsController и обновление результатов» *
В: Любые предложения по устранению ошибки и получению «update ()», работающему с struts2-rest-plugin?
PS: у меня похожие проблемы со всеми тремя «update ()», «show ()» и «destroy ()». Каждый ожидает идентификатор (который я вижу в отладчике Eclipse, передается правильно).
Также:
Плагин struts-rest-plug поддерживает URL-адреса, такие как http://localhost:8080/myapp/contacts.json
(для JSON) и http://localhost:8080/myapp/contacts.xml
(для XML). Я не уверен, что для update () нужно contacts.json/id
или просто contacts/id
. Ни одна работа: (