在struts2的项目中,进行路径跳转时,没有访问指定action,而是直接返回input,从而会出现404或者错误访问的问题。
出现这种问题一般是因为页面传递的参数类型与action所接受的不一致导致的,致使struts拦截器(StrutsConversionErrorInterceptor)进行了拦截。
StrutsConversionErrorInterceptor继承了ConversionErrorInterceptor方法,主要拦截方法是ConversionErrorInterceptor的intercept方法
可以在while里面打上断点,查出是哪个参数导致的(版本不同,也可能是if方法)
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext invocationContext = invocation.getInvocationContext();
Map<String, Object> conversionErrors = invocationContext.getConversionErrors();
ValueStack stack = invocationContext.getValueStack();
HashMap<Object, Object> fakie = null;
Iterator i$ = conversionErrors.entrySet().iterator();
while(i$.hasNext()) {
Entry<String, Object> entry = (Entry)i$.next();
String propertyName = (String)entry.getKey();//类型不一致拦截的参数名称
Object value = entry.getValue();//参数内容
if (this.shouldAddError(propertyName, value)) {
String message = XWorkConverter.getConversionErrorMessage(propertyName, stack);
Object action = invocation.getAction();
if (action instanceof ValidationAware) {
ValidationAware va = (ValidationAware)action;
va.addFieldError(propertyName, message);
}
if (fakie == null) {
fakie = new HashMap();
}
fakie.put(propertyName, this.getOverrideExpr(invocation, value));
}
}
一般情况下修改完类型就行了。
也有一些特殊情况,比如list接收string也会报错,导致这中情况的原因有可能是版本导致的,也可以把list改成字符数组string[] 接收。