2017-12-15 38 views
0

글래스 피쉬 4에서 글래스 피쉬 5로 전환했고 글래스 피쉬가 더 이상 내 DateTimeAdapter 클래스의 비례 정렬 메소드를 호출하지 않는다는 사실을 확인했습니다. 글래스 피시 4에서는 괜찮 았습니다. 웹 서비스 클래스는 json 데이터를받으며 자동으로 적절한 RegisterItemDTO 개체. getter 메서드에 주석을 넣으려고했지만 여전히 작동하지 않습니다. unmarshal 메서드는 호출되지 않았습니다. 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

글래스 피쉬 5는 더 이상 MOXy를 기본 제공 업체로 사용하지 않는다고 생각합니다. 스택 트레이스를 보면, JSON Binding인데, 유니폼의 경우 공급자는 jersey-media-json-binding입니다.

프로젝트에 jersey-media-moxy 또는 jersey-media-json-jackson을 추가하고 MoxyJsonFeature 또는 JacksonFeature을 각각 등록 할 수 있습니다. 둘 다 주석을 지원합니다. 당신이 그 중 하나를 사용하는 경우 최신 버전을 얻을 있는지 확인하십시오. 그리고 단지 의견의 문제, 나는 잭슨 공급자를 선택합니다.