首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能改变valueStack of Struts2?

为什么我不能改变valueStack of Struts2?
EN

Stack Overflow用户
提问于 2016-07-24 09:21:28
回答 1查看 230关注 0票数 2

我在拦截器中对Struts2 2的值堆栈做了一些操作,代码如下:

代码语言:javascript
复制
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;
}

拦截前的评估库是:

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

拦截后的评估库是:

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

它被缝上了估值库有changed.However,真正的返回结果是:

代码语言:javascript
复制
{
"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": "头部按摩很爽很爽"
 }
]
}

我使用xml配置,代码如下:

代码语言:javascript
复制
<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>

返回结果不会更改。为什么和如何改变这个,得到改变的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-24 12:11:17

在对象被序列化之后,您将修改它,因此JSON包含旧的值。

在执行PreResultListener结果之前,可以在拦截器中使用json来处理数据。

PreResultListener PreResultListener可能会影响拦截器/动作阶段和结果阶段之间的动作调用。典型的用途包括切换到不同的Result,或者在ResultAction对象执行之前以某种方式修改Result对象。 公共类MyInterceptor扩展AbstractInterceptor {.公共字符串拦截(ActionInvocation调用)抛出异常{invocation.addPreResultListener(新PreResultListener() ){公共PreResultListener(ActionInvocation调用,String resultCode) { //执行结果执行}之前必需的操作};}.}

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38550494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档