【问题标题】:java.lang.IllegalArgumentException, yet argument appears to be of valid typejava.lang.IllegalArgumentException,但参数似乎是有效类型
【发布时间】:2014-12-01 10:01:55
【问题描述】:

我有一个 jax-ws 网络服务类,其网络操作写成:

public String processIncomingMsg(int msgType, String senderCB, int receiveCB,
                int ussdOpType, String msIsdn, String serviceCode,
                int codeScheme, String ussdString,
                NamedParameterList extenionInfo) {

该服务部署在 glassfish 网络服务器中,因此我可以访问http://localhost:8080/AppName/ReceiveUSSDNotifications?Tester,这是一种用于调用网络服务操作的表单。当我输入receiveCB时,方法参数之一,为0XFFFFFF。我在 glassfish 服务器日志和

中看到“无法在 int 中转换 0xFFFFFFFF”
WS00041: Service invocation threw an exception with message : null; Refer to the server log for more details
Exceptions details : java.lang.IllegalArgumentException
javax.servlet.ServletException: java.lang.IllegalArgumentException at org.glassfish.webservices.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:342) 
at org.glassfish.webservices.monitoring.WebServiceTesterServlet.invoke(WebServiceTesterServlet.java:106) 
at org.glassfish.webservices.JAXWSServlet.doPost(JAXWSServlet.java:157) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)  
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
at ...

作为来自浏览器的响应(错误日志)。我想知道可能出了什么问题,因为0xffffff 只是一个整数的十六进制表示,所以不应该有转换问题。

【问题讨论】:

  • receiveiveCb 是如何传递给你的方法的?您确定它是0xFFFFFF 而不是"0xFFFFFF"(字符串表示形式)。请添加更多代码。方法原型和堆栈堆栈对于我们来说是非常糟糕的信息。
  • 我使用位于http://localhost:8080/AppName/ReceiveUSSDNotifications?Tester 的表单将参数传递给processIncomingMsg receiveCB 只是我提供的众多参数之一。还有其他整数文字作为基数 10 整数提供,它们似乎可以作为整数传递给方法。
  • 仍然没有足够的信息。
  • 我提供了方法定义、调用机制和两个错误日志输出,一个来自控制台,一个来自浏览器。我不知道您可能还需要什么其他信息,因为您没有指定它。

标签: java web-services soap glassfish jax-ws


【解决方案1】:

您应该在此处发布完整的堆栈跟踪。

从表面上看,我会说你的期望是不现实的:

  1. 出于所有意图和目的,您提供的是 String 并且根据您的操作定义,它应该被转换为 int。可能发生这种情况的唯一方法是使用Integer.parseInt 的某些变体,特别是将十六进制转换为十进制的变体Integer.parseInt(int, 16)。该方法的任何其他化身都会以NumberFormatException 爆炸。测试工具或 JAXB 怎么会知道您没有提供 Base-10 格式,而是使用正确的 parseInt 变体?更不用说前面的“0x”会让它无论如何都无法转换

  2. 即使它以某种方式被转换,你也会发现Integer.MAX_VALUE== 2147483647,它小于FFFFFF==4294967295。另一个NumberFormatException。你应该有一个long

【讨论】:

  • 我的假设似乎是错误的。我知道从客户端传递的参数通常作为字符串传递给应用程序,但我认为 JAX-WS 会自动转换为合适的类型。此外,我通过了其他一些ints(以 10 为基数)并且服务器没有标记它们,这也提高了我的假设。我应该提到这是 JavaEE 的新手。这个答案给了我很多见识。谢谢!
  • 您的意思是您传递了一个常规(非十六进制)整数作为参数并且它有效,是吗?和“6”一样? @Lym
  • 正确!我传递了其他“正常”整数,只有非基数 10 的整数被标记。
  • 了解@Lym。如果此答案解决了您的问题,请不要忘记接受
  • 原来服务 API 手册有错字。 wsdl 将receiveCB 声明为字符串。 0xffffffff 无论如何都超出了范围,因为 java 默认使用 32 位存储 int,这是您暗示的事实,但我已经跳过了。为过度评论道歉。你的回答确实解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2022-11-23
  • 2021-07-17
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多