веб-сервис не вычитает время в строке - PullRequest
0 голосов
/ 26 мая 2018

веб-сервис получает две строки 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

Что я должен изменить, чтобы сделать вычитание?

1 Ответ

0 голосов
/ 26 мая 2018

Отражение?

Ваша ошибка, вероятно, не связана с анализом строки времени суток, поскольку исключение относится к классу в пакете .reflect.

java.время

Вы используете неправильный тип класса для времени суток.Класс java.util.Date предназначен для значения даты со временем.У вас нет даты.

Также вы используете проблемные старые унаследованные классы даты и времени, вытесненные годами назад классами java.time .

Для времени сутокзначение, используйте LocalTime.

LocalTime start = LocalTime.parse( "12:34" ) ;
LocalTime stop = LocalTime.parse( "15:00" ) ;

Часовой пояс только с временем суток?

Я понятия не имею, почему ваши строковые входы для времени дня будут отображатьZ в конце.A Z в дате и времени означает UTC.И UTC не имеет значения в контексте значения времени суток.Поэтому я проигнорирую часть вашего вопроса 'Z'.

Duration

Рассчитайте прошедшее время, используя Duration.

Duration d = Duration.between( start , stop ) ;

Locale

Нет необходимости указывать Locale при разборе строки времени в стандартном формате ISO 8601 .

A Locale требуется только при локализации / переводе, когда нам требуются человеческий язык и культурные нормы.

Дата и зона

Я подозреваю, что вы должны использоватьдата вместе с вашим временем суток, а также часовой пояс.Но Вопрос не объясняет бизнес-проблему, поэтому я только предполагаю, учитывая ваше наименование.

Имейте в виду, что расчеты времени суток ограничены одним общим 24-часовым днем.Вы не можете идти после полуночи на следующий день.Таким образом, ваше время остановки всегда должно быть позже (больше), чем ваше время начала (если вы не хотите, чтобы результат с отрицательным числом возвращался назад во времени).

Обучение отладке

Обучение отладке имеет решающее значениебыть программистом.

Когда вы сталкиваетесь с подобной проблемой, выделите то, что вы подозреваете в качестве причины (время анализа), в простое маленькое одноразовое приложение.Получите базовые функциональные возможности, прежде чем использовать их в более широком объеме вашего сложного приложения (веб-приложение, сервлеты, веб-контейнер и т. Д.).Если ваш код работает в одноразовом приложении, но не в реальном (сложном) приложении, то вы знаете, что истинная причина проблемы почти наверняка кроется в другом месте.


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в 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 перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android классов java.time.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

Проект ThreeTen-Extra расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

...