Возврат ответа в POST-запросе плагина RESTful для Struts2

Я реализовал Struts2 REST API, получив информацию здесь

Struts2 Rest Plugin

Есть ли способ вернуть пользовательский ответ в плагин restful в Struts2. Я сделал все необходимые изменения, такие как

struts.rest.content.restrictToGET = false

Получил от этого вопроса. Тем не менее я получаю эту ошибку

No result defined for action `com.web.Controller.RestDemoController` and result create, 

Если я не добавлю вышеупомянутую строку, я все равно получу тот же ответ.

Это действие, которое я предоставил в struts.xml:

<action name="restdemo" class="com.web.Controller.RestDemoController">
    <interceptor-ref name="customRestStack"></interceptor-ref>
</action>

Это обслуживает все просьбы GET,POST,PUT,UPDATE,

После изменения типа возвращаемого метода записи с HttpHeader на String я все еще получаю ту же ошибку

Error 404: No result defined for action com.web.Controller.RestDemoController and result <?xml version="1.0" encoding="UTF-8"?> <Status><code>200</code><message>Success</message></Status>

Это код, который я написал для POST:

public HttpHeaders create(){
    System.out.println(envision2Data.toString());
    return new DefaultHttpHeaders("create").withStatus(200);
}

это метод запроса POST с типом возврата String:

public String create(){
    System.out.println(envision2Data.toString());
    return "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <Status><code>200</code><message>Success</message></Status>";
}

Я получаю идеальный ответ для получения либо, если я отправляю запрос для XML или JSON, я получаю XML и JSON на основе расширения. лайк http://localhost:8080/restdemoapplication/restdemo.xml, http://localhost:8080/restdemoapplication/restdemo.json

для запроса POST я делаю пост-запрос как

и вы можете увидеть ответ, который я получаю. Метод, который я написал для поста, написан выше с именем create. У меня есть данные в теле, и я получаю данные в методе создания отлично.

Теперь в посте, как я видел в нескольких примерах, как

Struts-Rest, Stuts2-Rest-sample, Struts2-Rest-Shopping-List

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

<?xml version="1.0" encoding="UTF-8"?> <Status><code>200</code><message>Success</message></Status>

После некоторой отладки я обнаружил, что DefaultContentTypeHandlerManager в struts2-rest-плагине посмотрим xhtml как шаблон по умолчанию. Пока это должен быть либо XML, либо JSON.

я хочу вернуться

 code : 1xx,2xx,4xx
 message: Success, Fail

в формате XML или JSON, когда запрос POST принят.

(Это приложение поддерживает и запросы без перерыва, и запросы перезапуска. Я могу сделать xml или json шаблоном по умолчанию, но я не хочу, поскольку это будет влиять на запросы без перерывов.)

2 ответа

Решение

Вы неправильно поняли концепцию типов контента, используемых с struts2-rest-plugin.

Типы контента

В дополнение к обеспечению сопоставления вызовов RESTful URL с вызовами Controller ( Action), плагин REST также предоставляет возможность создавать несколько представлений данных ресурса. По умолчанию плагин может возвращать ресурс в следующих типах контента:

  • HTML
  • XML
  • JSON

Здесь ничего не настраивается, просто добавьте расширение типа контента к вашему RESTful URL. Каркас позаботится об остальном. Так, например, предполагая, что контроллер называется Movies и фильм с id из superman, следующие URL-адреса все попадут на

http://my.company.com/myapp/movies/superman
http://my.company.com/myapp/movies/superman.xml
http://my.company.com/myapp/movies/superman.xhtml
http://my.company.com/myapp/movies/superman.json

Обратите внимание, что эти типы контента также поддерживаются как входящие типы данных. И, если вам нужно, вы можете расширить функциональность, написав свои собственные реализации org.apache.struts2.rest.handler.ContentTypeHandler и регистрация их в системе.

Серверы плагинов запрашивают по типу контента, либо предоставленные как расширение действия, либо предоставив тип данных. Тип входящих данных определяется "Content-Type" заголовок и исходящий тип данных, определяемый "Accept" заголовок.

Делать POST запросить возврат данных вам нужно добавить константу в конфигурационный файл Struts struts.xml:

<constant name="struts.rest.content.restrictToGET" value="false"/>

Демонстрационное приложение поставляется с дистрибутивом Struts с именем struts2-rest-showcase, После добавления константы выше вы можете протестировать приложение с помощью некоторого http-клиента.

POST http://localhost:8080/orders
Accept: application/json
Content-Type: application/json
{
  "id":"23423423",
  "clientName":"Roman C",
  "amount": 1000
}
 -- response --
201 
Content-Language:  en-US
Content-Length:  54
Content-Type:  application/json;charset=UTF-8
Date:  Sat, 07 Oct 2017 20:44:39 GMT
ETag:  -735433458
Location:  http://localhost:8080/orders/23423423

{"amount":1000,"clientName":"Roman C","id":"23423423"}

Итак, вот решение, которое мне было нужно. Что я сделал

@Override
public Object getModel() {
        <!-- Changed name of the object overhere to mainObject-->
    if (mainObject == null) {
        if (responseObject != null) {
            return responseObject;
        } else if (mainObject != null) {
            return mainObject;
        }
        mainObject = new mainObject();
    }
    return mainObject;
}

а затем в обработчике типа контента. Обработчик Content-Type является пользовательским, так как я использовал Джексона для преобразования из JSON в объект и наоборот.

if (paramObject instanceof MainObject) {
        MainObject mainObject = (MainObject) paramObject;
        writer.write(mapper.writeValueAsString(mainObject));
} else if (paramObject instanceof ResponseObject) {
        ResponseObject responeObject = (ResponseObject) paramObject;
        writer.write(mapper.writeValueAsString(responeObject));
} 
Другие вопросы по тегам