2014-01-21 2 views
1

Я использую Struts2 и request.getInputStream() не может быть использован, так как он дает ошибку при 2-м использовании, возможно, уже может быть использован любым из перехватчиков.Как получить тело запроса в Struts2 при использовании struts2-json-plugin

Итак, я считаю, что должен быть какой-то способ получить тело запроса. Но я ничего не нашел в Интернете, пожалуйста, помогите.

+1

Struts 2 StrutsPrepareAndExecuteFilter должен прочитать запрос, чтобы извлечь информацию для заполнения объекта действия и т. Д. Пожалуйста, дайте нам дополнительную информацию о том, что вам нужно восстановить из этого входного потока; что бы это ни было, возможно, Struts 2 уже делает это за вас –

+0

@Jorge_B В моем случае JSON отправляется в тело запроса, в случае какой-либо ошибки, что JSON мне нужно зайти в базу данных, но я не могу получить requestBody. –

+0

Вы получаете незаконное государственное исключение? –

ответ

0

Как вы говорите, перехватчик (я думаю, JSONInterceptor) уже выполнил задание раньше для вас. Возможно, у вас есть аналогичные структуры struts.xml:

struts.xml

<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="rest"/> 
<constant name="struts.rest.namespace" value="/rest" /> 

<constant name="struts.rest.negotiation.handlerOverride.application/json" value="json" /> 


<package name="rest" namespace="/rest" extends="rest-default">   
     <interceptors> 
      <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/> 
     </interceptors>   

     <action name="yourAction" class="com.struts.rest.MyController">      
      <interceptor-ref name="json" />  
      <interceptor-ref name="defaultStack"/> 
     </action> 
</package> 

Затем, если вы пытаетесь разобрать запрос JSON как это:

{ "token":"mh5h6jrjkvnrk56" } 

Вы должны иметь a Контроллер (или действие):

package com.struts.rest; 
import ... 

public class MyController implements ModelDriven<Result>{ 

    private static final long serialVersionUID = 1L; 
    private static final Logger logger = Logger.getLogger(MyController.class.getName()); 
    private String token;   

    // Handles GET requests 
    public String index() {       
     logger.info("token: " + token);   
     return "index";    
    } 

    // Handles /POST requests 
    public String create(){  
     // .... 
     return "create"  
    } 

    // Handles /PUT requests 
    public HttpHeaders update() { 
     // .... 
     return "update" 
    }   

    public String getToken() { 
     return token; 
    } 

    public void setToken(String token) { 
     this.token = token; 
    } 
} 

В a RequestAware/ServletRequestAware Действия вы должны получить доступ к запросу с request.getInputStream(), но когда действует JSONInterceptor, просто дайте ему выполнить эту работу. Создайте столько полей, сколько элементов JSON, которые нужно проанализировать в Action/Controller. В этом примере я создаю поле String token (с его установщиком и геттером) для хранения содержимого элемента «Junction» JSON.

Когда/GET (с { «маркер»: «mh5h6jrjkvnrk56»}) выполняется, index() называется и поле token имеет значение «mh5h6jrjkvnrk56» (как в примере).

Смежные вопросы