java json struts2 interceptor valuestack

java - ¿Por qué no puedo cambiar el valueStack de Struts2?



json interceptor (1)

Está modificando el objeto después de haberlo serializado, por lo que JSON contiene el valor anterior.

Puede usar PreResultListener en el interceptor para manejar los datos antes de que se ejecute el resultado json .

PreResultListener

Un PreResultListener puede afectar una invocación de acción entre el interceptor / fase de acción y la fase de resultado. Los usos típicos incluyen cambiar a un Result diferente o de algún modo modificar los objetos de Result o Action antes de que se ejecute el Result .

public class MyInterceptor extends AbstractInterceptor { ... public String intercept(ActionInvocation invocation) throws Exception { invocation.addPreResultListener(new PreResultListener() { public void beforeResult(ActionInvocation invocation, String resultCode) { // perform operation necessary before Result execution } }); } ... }

Hago alguna operación de la pila de valores de Struts2 en un interceptor, código como este:

public String intercept(ActionInvocation actionInvocation) throws Exception { String invokeRes = actionInvocation.invoke(); ValueStack valueStack = actionInvocation.getStack(); List<Object> shouldCheckFieldValues = Lists.newArrayList(); List<String> keywords = Lists.newArrayList("哈哈", "头部", "测试"); RegexKeywordFilter filter = new RegexKeywordFilter(); filter.add(keywords); filter.compile(); final ReplaceStrategy highLightStrategy = new ReplaceStrategy() { @Override public String replaceWith(String keyword) { return "<span style=''background-color:red;''>" + keyword + "</span>"; } }; Object respObj = valueStack.findValue("resp"); if (respObj instanceof JoyPageWebDTO) { JoyPageWebDTO pageWebDTO = (JoyPageWebDTO) respObj; List<?> recordsList = pageWebDTO.getRecords(); if (CollectionUtils.isNotEmpty(recordsList)) { for (Object audit : recordsList) { for (Field field : audit.getClass().getDeclaredFields()) { if (field.isAnnotationPresent(AICheck.class)) { boolean fieldIsAccess = field.isAccessible(); if (!fieldIsAccess) field.setAccessible(true); Object fieldValue = field.get(audit); if (fieldValue instanceof String && filter.hasKeywords((String) fieldValue)) { String replacedStr = filter.replace((String) fieldValue, highLightStrategy); field.set(audit, replacedStr); } if (!fieldIsAccess) field.setAccessible(false); } } } } } return invokeRes; }

El valuestack antes de interceptar es:

[ http://i.stack.imgur.com/SHqqD.png]

El valgueck después de interceptar es:

[ http://i.stack.imgur.com/Ths7m.png]

Está cosido que el valgueck ha cambiado. Sin embargo, el resultado realmente es:

{ "pageIndex": 0, "pageSize": 30, "recordCount": 0, "records": [ { "auditContent": "", "auditID": 354, "auditStatus": 3, "bizStatus": 1, "bodyPart": "2", "categoryID": 141, "city": "上海", "desc": "22", "duration": 2, "forbidden": "2", "indications": "2", "name": "头部按摩很爽很爽" } ] }

Yo uso xml config, código como este:

<package name="ajax" namespace="/ajax" extends="json-default"> <interceptors> <interceptor name="aiCheck" class="com.dianping.joy.admin.web.interceptor.AICheckInterceptor"> </interceptor> <interceptor-stack name="defaultInterceptorStack"> <interceptor-ref name="aiCheck" /> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="defaultInterceptorStack"/> <action name="searchJoySpu" class="com.action.SpuSearchAction"> <result type="json"> <param name="root">resp</param> </result> </action> </package>

El resultado de la devolución no cambia. ¿Por qué y cómo puedo cambiar esto para obtener el resultado modificado?