我在拦截器中执行Struts2的值栈操作,代码如下:
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]
它的价值已经改变了。但是,真正的返回结果是:
{
"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>
返回结果不会更改。为什么以及如何更改此更改结果?
答案 0 :(得分:3)
您在序列化后修改对象,因此JSON包含旧值。
您可以在拦截器中使用PreResultListener
来处理执行json
结果之前的数据。
PreResultListener
PreResultListener
可以影响之间的动作调用 拦截/行动阶段和结果阶段。典型用途包括 切换到不同的Result
或以某种方式修改Result
或 在Action
执行之前,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 } }); } ... }