2015-05-14 56 views
-1

我已经使用tomcat web容器和泽西库制作了一个简单的RESTful Web服务。ArrayIndexOutOfBoundsException:1在Web服务器中

我只覆盖了post方法,其余的所有默认设置都被使用。

在从服务器机器发送POST来自curl的查询时,我收到了预期的响应。从其他机器也,我得到预期的响应GET查询,但对于POST我得到java.lang.ArrayIndexOutOfBoundsException: 1异常错误。 POST方法是这样的:

@POST 
@Produces(MediaType.TEXT_PLAIN) 
public String post(String str) { 
    String[] parts = str.split("&"); 
    String[] param1 = parts[0].split("=");//value1=param1[1] (one/two): query type 
    String[] param2 = parts[1].split("=");//value2=param2[1] 
    String[] param3 = parts[2].split("=");//value3=param3[1] 
    String[] param4 = parts[3].split("=");//value4=param4[1] 

    if(param1[1].equals("one")){ 
     return hashGenerator(param2[1],param3[1]); 
    }else if(param1[1].equals("two")){ 
     return saveInput(param2[1],param3[1],param4[1]); 
    } 
    return "Unexpected Query"; 
} 

从服务器的响应是:

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

javax.servlet.ServletException: java.lang.ArrayIndexOutOfBoundsException: 1 
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:421) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:222) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 

root cause 

java.lang.ArrayIndexOutOfBoundsException: 1 
com.va.jersey.helloworld.Hello.post(Hello.java:39) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:606) 
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:164) 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:181) 
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:203) 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:101) 
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:305) 
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:288) 
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1110) 
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:401) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:386) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:222) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 

可以请您建议可能故障....

+0

发布您的'com.va.jersey.helloworld.Hello'我的意思是代码特别是post方法。 – Saif

+0

你的一个'split'不给你2个阵列位置...... –

+0

当我给命令'curl --data“param1 = value1&param2 = value2&param3 = value3&param4 = value4&”http:// myAddr ...... ../.../.....'我得到了正确的回复 –

回答

1

您所要求的可能不存在的数组元素,所以在一个字符上拆分输入字符串而不检查数组的长度总是会在以后尝试使用这些不存在的数组元素(输入字符串为foo&bar会这样做)时冒着ArrayIndexOutOfBoundsException的风险。

此外,你不应该自己做表单数据/查询字符串解析,边缘情况太多。使用一个库,或者更好地使用你的框架(Jersey) - 它作为JAX-RS的一部分,有support for Form Params。见an example here

或者您可以使它更加RESTful并使用PathParam s在请求中明确地提取参数,如果这是一个选项。