2017-12-15 29 views
0

Glassfish 4からGlassfish 5に切り替えたところ、GlassfishがDateTimeAdapterクラスの非マーシャルメソッドと呼ばれなくなったことに気付きました。Glassfish 4ではうまくいきました。Webサービスクラスはjsonデータを受け取り、自動的に適切なRegisterItemDTOオブジェクト。私はgetterメソッドにアノテーションを入れようとしましたが、それでも動作しませんでした。アンマーシャルメソッドは呼び出されませんでした。私は、jsonデータが正しいフォーマットであることを確認しました。Glassfish 5はJAXB @XmlJavaTypeAdapterアノテーションを無視しますか?

サービスクラス:

@Stateless 
@Path("") 
public class InventoryService 
{   
    @POST 
    @Path("/incoming_goods") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public Response addIncomingGood(RegisterItemDTO _dto) throws Exception { 

    // ..... 

    } 
} 

Objectクラス:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class RegisterItemDTO 
{  
    @XmlJavaTypeAdapter(DateTimeAdapter.class) 
    private Date incomingDate; 

    // .... 
    // I've tried putting the annotation on the getter method and it still didn't work 
    // @XmlJavaTypeAdapter(DateTimeAdapter.class) 
    // public Date getIncomingDate() {return incomingDate;} 
} 

アダプタクラス:

public class DateTimeAdapter extends XmlAdapter<String, Date> 
{ 
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

    @Override 
    public Date unmarshal(String xml) throws Exception 
    { 
     try { 
      System.out.println ("DATE FORMAT CALLED"); // this is never printed 
      return dateFormat.parse(xml); 
     } 
     catch(Exception e) { 
      System.out.println ("Error: " + e.getMessage()); 
      e.printStackTrace(); 
      throw e; 
     } 
    } 

    // .. 
} 

例外:

Info: Exception Mapper: Error deserializing object from entity stream. 
Severe: javax.ws.rs.ProcessingException: Error deserializing object from entity stream. 
    at org.glassfish.jersey.jsonb.internal.JsonBindingProvider.readFrom(JsonBindingProvider.java:101) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156) 
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:73) 
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156) 
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1091) 
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874) 
    at org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:271) 
    at org.glassfish.jersey.server.internal.inject.EntityParamValueParamProvider$EntityValueSupplier.apply(EntityParamValueParamProvider.java:97) 
    at org.glassfish.jersey.server.internal.inject.EntityParamValueParamProvider$EntityValueSupplier.apply(EntityParamValueParamProvider.java:80) 
    at org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.apply(ParamValueFactoryWithSource.java:74) 
    at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:92) 
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:133) 
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:200) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:493) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:415) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:104) 
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:272) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:268) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:316) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:298) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:268) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703) 
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1580) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:258) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:652) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:591) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:371) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:463) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:168) 
    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:242) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539) 
    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:593) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: javax.json.bind.JsonbException: Error parsing date from value: 2017-12-29 00:00:00 
    at org.eclipse.yasson.internal.serializer.AbstractDateTimeDeserializer.deserialize(AbstractDateTimeDeserializer.java:64) 
    at org.eclipse.yasson.internal.serializer.AbstractValueTypeDeserializer.deserialize(AbstractValueTypeDeserializer.java:64) 
    at org.eclipse.yasson.internal.serializer.ObjectDeserializer.deserializeNext(ObjectDeserializer.java:163) 
    at org.eclipse.yasson.internal.serializer.AbstractContainerDeserializer.deserializeInternal(AbstractContainerDeserializer.java:84) 
    at org.eclipse.yasson.internal.serializer.AbstractContainerDeserializer.deserialize(AbstractContainerDeserializer.java:60) 
    at org.eclipse.yasson.internal.Unmarshaller.deserializeItem(Unmarshaller.java:57) 
    at org.eclipse.yasson.internal.Unmarshaller.deserialize(Unmarshaller.java:50) 
    at org.eclipse.yasson.internal.JsonBinding.deserialize(JsonBinding.java:45) 
    at org.eclipse.yasson.internal.JsonBinding.fromJson(JsonBinding.java:85) 
    at org.glassfish.jersey.jsonb.internal.JsonBindingProvider.readFrom(JsonBindingProvider.java:99) 
    ... 60 more 
Caused by: java.time.format.DateTimeParseException: Text '2017-12-29 00:00:00' could not be parsed at index 10 
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) 
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1777) 
    at org.eclipse.yasson.internal.serializer.DateTypeDeserializer.parseDefault(DateTypeDeserializer.java:49) 
    at org.eclipse.yasson.internal.serializer.DateTypeDeserializer.parseDefault(DateTypeDeserializer.java:29) 
    at org.eclipse.yasson.internal.serializer.AbstractDateTimeDeserializer.deserialize(AbstractDateTimeDeserializer.java:62) 
    ... 69 more 

答えて

1

私はGlassfish 5がMOXyをデフォルトプロバイダとして使用していないと思います。スタックトレースを見ると、JSON Bindingのようになり、ジャージーの場合、プロバイダはjersey-media-json-bindingです。

jersey-media-moxyまたはjersey-media-json-jacksonをプロジェクトに追加し、それぞれMoxyJsonFeatureまたはJacksonFeatureのいずれかを登録できます。どちらもアノテーションをサポートします。それらのいずれかを使用する場合は、最新バージョンを入手してください。そして意見の問題だけで、私はJacksonのプロバイダを選ぶだろう。

関連する問題