REST и не RESTful URL вместе не работают
Все мои попытки получить работающий пример обеих, чистой конфигурации с перегрузкой и хотя бы одного URL без перегрузки не увенчались успехом.
У меня есть эта страница в качестве руководства: https://cwiki.apache.org/confluence/display/WW/REST+Plugin
У меня есть одна модель, Receipt
с несколькими тестовыми полями.
Чистое решение REST работает, как и ожидалось, так:
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.devMode" value="true"/>
<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"/>
хорошо работает с этими результатами:
receipt.json
=> отобразить список всех чеков
receipt/1.json
=> отобразить квитанцию с id = 1
Но если я попытаюсь смешать restful с non-restful URL-адресами (так же, как мне сказали в вики-статье), вот так:
<constant name="struts.action.extension" value="xhtml,,xml,json,action"/>
<constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper" />
<constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/>
<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"/>
это взрывается с этим:
Struts has detected an unhandled exception:
Messages:
com.immaculate.receipto.controllers.ReceiptController.execute()
File: java/lang/Class.java
Line number: 1,778
Я сбит с толку. Почему он выполняет execute()? execute() должен быть методом, присутствующим в действиях. Я не даю ему действие, я даю ему контроллер, как раньше.
Как это исправить?
Вот ReceiptController
:
public class ReceiptController implements ModelDriven<Object> {
private ReceiptManager receiptManager = new ReceiptManager();
private String id;
private Receipt model = new Receipt();
private Collection list;
public Object getModel(){
if(list==null){
return model;
} else {
return list;
}
}
public HttpHeaders create() {
receiptManager.save(model);
return new DefaultHttpHeaders("show");
}
public HttpHeaders show() {
model = receiptManager.find(id);
return new DefaultHttpHeaders("show");
}
public HttpHeaders destroy() {
model = receiptManager.destroy(id);
return new DefaultHttpHeaders("show");
}
public HttpHeaders index() {
list = receiptManager.list();
return new DefaultHttpHeaders("show");
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
Очевидно, я делаю что-то не так здесь. Нужно ли мне знать что-то еще, кроме того, что объясняется здесь?
Кроме того, как я могу это прочитать?:
<constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/>
Значит ли это, что все начинается с /rest
будет сопоставлен с моим чистым контроллером отдыха, который, в свою очередь, сопоставит мою квитанцию и все что угодно без /rest
префикс будет сопоставлен с отображением стоек по умолчанию? или я тут совсем не в том направлении?
2 ответа
Преобразователь на основе действия отображает делегаты, находящие отображение на соответствующий преобразователь, определенный
<constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/>
Это означает, что все URL, которые имеют /rest
в URL до последней косой черты /
сопоставлены с остальным сопоставителем, другие - с сопоставителем по умолчанию. Если у тебя есть receipt
контроллер, то вы должны использовать значение "/receipt:rest,:struts"
,
Рекомендации:
У меня тоже была такая же ошибка, я исправляю, добавив
<package name="api" namespace="/api" extends="rest-default">
<action name="users/*" class="com.aurum.struts.rest.UserController">
<param name="id">{1}</param>
</action>
</package>
полный пример для действий REST и Non-REST вместе здесь https://github.com/sivailango/struts2-rest-nonrest