Web 服务收到两个字符串Hora_in并Hora_out,我正在尝试将这些字符串转换为日期,减去两个字符串的转换并将结果转换为字符串,但出现了错误。
WS00041:服务调用引发异常,消息为 :null;有关更多详细信息,请参阅服务器日志
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.ejb.Stateless;
@WebService(serviceName = "Parking")
@Stateless()
public class Parking {
/**
* This is a sample web service operation
* @param Hora_in
* @param Hora_out
* @return
* @throws java.text.ParseException
*/
@WebMethod(operationName = "Reserva")
public String Reserva(@WebParam(name = "Hora_in") String Hora_in, @WebParam(name = "Hora_out") String Hora_out) throws ParseException {
String parqueo;
Locale locale = new Locale("es","CO");
String hourf = "HH:mm:ss 'Z'";
SimpleDateFormat format = new SimpleDateFormat(hourf, locale);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
Date Hin = format.parse(Hora_in);
Date Hout = format.parse(Hora_out);
long diff = Hin.getTime() - Hout.getTime();
Date difh = new Date(diff);
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss 'Z'");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
parqueo=dateFormat.format(difh);
return parqueo;
}
}
在WS00041下方,将显示以下消息:
Exceptions details : java.lang.reflect.InvocationTargetException
javax.servlet.ServletException: java.lang.reflect.InvocationTargetException
at org.glassfish.webservices.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:342)
at org.glassfish.webservices.monitoring.WebServiceTesterServlet.invoke(WebServiceTesterServlet.java:106)
at org.glassfish.webservices.EjbWebServiceServlet.service(EjbWebServiceServlet.java:143)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.glassfish.grizzly.servlet.ServletHandler.doServletService(ServletHandler.java:226)
at org.glassfish.grizzly.servlet.ServletHandler.service(ServletHandler.java:178)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.glassfish.webservices.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:313)
... 24 more
Caused by: jaxws.ParseException_Exception: Unparseable date: "10:00"
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:147)
at com.sun.xml.ws.client.sei.StubHandler.readResponse(StubHandler.java:253)
at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:203)
at com.sun.xml.ws.db.DatabindingImpl.deserializeResponse(DatabindingImpl.java:290)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:92)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:161)
at com.sun.proxy.$Proxy444.reserva(Unknown Source)
... 29 more
我应该改变什么来做减法?
反射?
您的错误可能与分析一天中的时间字符串无关,因为异常与.reflect
包中的类有关。
java.time
您在一天中的某个时间使用了错误的类类型。java.util.Date
类用于使用时间的日期值。你没有日期。
此外,您正在使用麻烦的旧旧日期时间类,这些类几年前被java.time类所取代。
对于时间值,请使用LocalTime
。
LocalTime start = LocalTime.parse( "12:34" ) ;
LocalTime stop = LocalTime.parse( "15:00" ) ;
时区只有一天中的时间?
我不知道为什么您在一天中某个时间的字符串输入会在最后Z
。日期时间的Z
表示 UTC。UTC 在仅时间值的上下文中没有任何意义。所以我将忽略你问题'Z'
部分。
Duration
使用Duration
计算经过的时间。
Duration d = Duration.between( start , stop ) ;
现场
解析标准 ISO 8601 格式的时间字符串时无需指定Locale
。
只有在需要人类语言和文化规范的本地化/翻译时,才需要Locale
。
日期和区域
我怀疑您应该使用日期以及一天中的时间和时区。但是这个问题并没有解释业务问题,所以我只是猜测你的命名。
请注意,时间计算仅限于一个通用的 24 小时制。你不能从午夜到第二天。因此,您的停止时间必须始终晚于(大于(您的开始时间(除非您想要负数结果,在时间上倒退(。
学习调试
学习调试对于成为一名程序员至关重要。
遇到这样的问题时,将您怀疑的原因(解析一天中的时间(分离到一个简单的一次性应用程序中。 先在复杂应用程序(Web 应用程序、servlet、Web 容器等(的更大范围内尝试它之前,先让您的基本功能正常工作。如果您的代码适用于一次性应用程序,但不适用于真正的(复杂(应用程序,那么您几乎肯定知道问题的实际原因在其他地方。
关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧传统日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
Joda-Time项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅Oracle 教程。并搜索堆栈溢出以获取许多示例和解释。规范为 JSR 310。
您可以直接与数据库交换java.time对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要java.sql.*
类。
从哪里获得java.time类?
Java SE 8、Java SE- 9、Java SE 10及更高版本
- 内置。
- 具有捆绑实现的标准 Java API 的一部分。
- Java 9添加了一些小功能和修复。
Java SE 6 和 Java SE 7 大部分 - java.time 功能在ThreeTen-Backport中向后移植到 Java 6 和 7。
Android- 更高版本的 java.time 类的 Android 捆绑实现。
- 对于早期的Android(<26(,ThreeTenABP项目适应了ThreeTen-Backport(如上所述(。请参阅如何使用ThreeTenABP...。
ThreeTen-Extra项目通过额外的类扩展了java.time。这个项目是未来可能添加到java.time的试验场。你可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等。