我在拦截器中对Struts2 2的值堆栈做了一些操作,代码如下:
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,真正的返回结果是:
{
"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配置,代码如下:
<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>返回结果不会更改。为什么和如何改变这个,得到改变的结果?
发布于 2016-07-24 12:11:17
在对象被序列化之后,您将修改它,因此JSON包含旧的值。
在执行PreResultListener结果之前,可以在拦截器中使用json来处理数据。
PreResultListener
PreResultListener可能会影响拦截器/动作阶段和结果阶段之间的动作调用。典型的用途包括切换到不同的Result,或者在Result或Action对象执行之前以某种方式修改Result对象。 公共类MyInterceptor扩展AbstractInterceptor {.公共字符串拦截(ActionInvocation调用)抛出异常{invocation.addPreResultListener(新PreResultListener() ){公共PreResultListener(ActionInvocation调用,String resultCode) { //执行结果执行}之前必需的操作};}.}
https://stackoverflow.com/questions/38550494
复制相似问题