Weblogic 12.2.1.2 - 如何调整对象序列化程序使用杰克逊2和应用程序/ json端点的jaxrs启用上的奇怪现象

问题描述:

在Weblogic JEE 7(版本12.2.1.2)上,我发现理解行为很奇怪与JAX-RS Web服务的启用和配置有关的应用程序服务器。Weblogic 12.2.1.2 - 如何调整对象序列化程序使用杰克逊2和应用程序/ json端点的jaxrs启用上的奇怪现象

我想要理解的第一点是我觉得很难理解的现象。 在哪里我测试,其中最初也只发生于组件的琐碎的JAX-RS Web服务的示例应用程序:

成分(A)

@ApplicationPath("rest") 
public class RestApplication extends Application { 

    private static final Logger LOGGER = LoggerFactory.getLogger(RestApplication.class); 

    // Class loading 
    { 
     LOGGER.info("Rest application static constructor invoked"); 
    } 

    /** 
    * Default not arguments constructor 
    */ 
    public RestApplication() { 
     LOGGER.info("Rest application default constructore invoked."); 
    } 

} 

哪些适当使基本上下文的所有其他端点你可能希望在您的部署中使用。 完全符合Wildfly - 100%。 对此组件没有什么可说的。

然后我们进入“沼泽”组件B,我们的休息端点。 在这个虚拟终端上有几个虚拟apis,我们只关注最微不足道的一个。

@Path("/exampleRestEndpoint") 
@Consumes({ "application/json", "text/html" }) 
@Produces({ "application/json" }) 
public class ExampleRestEndpoint { 

    private static final Logger LOGGER = LoggerFactory.getLogger(ExampleRestEndpoint.class); 

    @PostConstruct 
    public void postConstruct() { 
     LOGGER.info("Rest Endpoint constructed."); 
    } 

    @GET 
    @Path("/ping") 
    public BasicJsonResponseDto<String> ping() { 
     Instant date = Instant.now(); 
     return new BasicJsonResponseDto<String>("Ping-service invoked successfully. " + date.toString()); 
    } 
} 

我将在后面的底部详细介绍DTO类。 这里已经有讨论的要点。

对我来说,第一个讨论点是类的顶部的元数据注释,声明我们希望将这个端点传递回客户端application/json。

但是在我第一次写这个注解时,我实际上并没有添加任何这样的注解。 因此,在我的第一个实现中,应用程序服务器正在返回给我一个答复。 在第二个步骤中,当我添加了注释,指出其余端点还是被returing应用程序了/ JSON,weblogic的停止渲染抱怨以下中的任何响应:

重度:MessageBodyWriter找不到介质类型=应用/ json, type = class com.jersey.jaxb.Todo,genericType = class com.jersey.jaxb.Todo。

同样的野蝇实验,终点工作马上没有大麻烦。 下面的堆栈溢出线程得到我的工作答案: test serializations REST JAXRS

在WebLogic会抱怨说,它知道的知道身体的作家是能够redering此MIME类型,令人惊奇于我的,是任何JEE 7事实容器应该能够做到这一点,但可以!

在我的示例应用程序中,我在Web-inf/lib中抽取了以下依赖关系以进入战争。

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.8.6</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.module</groupId> 
    <artifactId>jackson-module-jaxb-annotations</artifactId> 
    <version>2.8.6</version> 
</dependency> 

并解决问题。 其他Web服务返回工作。 在铬上,我可以控制http响应元数据全部完美。

现在有趣的事情是,当我部署相同的应用程序并拿走杰克逊提供程序库时,其余端点将继续正常工作。其实,我不能再在我的环境中再现weblogic的抱怨,我不给他任何知道如何处理application/json回复的主体作者。

那么,这是我的第一个问题? 有没有人知道如果提供应用程序/ json的基本休息服务,如果weblogic预期会记录我引用的错误,那么示例应用程序不捆绑jackson库和jus使用jee7 apis。 有没有人有任何形式的oncept /解释的事实,当我拿走了依赖性的事情正如一般通常从一开始就预期的那样工作......但并不像人们*谷歌解决方案没有身体作家的问题? 我真的没有对此的解释...

现在的第二点是关于在我引用的/ ping API上使用返回对象的类。

最初,那个endpoing API正在返回一个纯粹的“String”。 ping消息没有被包装在任何类型的对象中。 当然,结果对象是没有真正的JSON对象返回对象只是一个“一些任意的字符串值”。

因此,这对于其他客户端来说当然是一个问题,即希望对有效的json进行反序列化,而不是获取对象或数组,而是获取管道上的纯原始数据。

因此,我做了一个实验,在一个支持对象下抽取像String和Integer这样的原始类型。

这是实施。 这个实现对于下一个问题很重要。

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = As.PROPERTY, property = "class") 
public class BasicJsonResponseDto<T> implements Serializable { 
    T value; 
    public BasicJsonResponseDto() { 
     super(); 
    } 
    public BasicJsonResponseDto(T value) { 
     super(); 
     this.value = value; 
    } 
    public T getValue() { 
     return value; 
    } 
    public void setValue(T value) { 
     this.value = value; 
    } 
    @Override 
    public String toString() { 
     return "BasicJsonResponseDto [value=" + value + "]"; 
    } 
} 

对于锐利的眼睛,它会立即明显,当一个响应对象到端点通过像这样一类交付的,“反序列化”的逻辑是不是一个简单的任务,在所有。 这个基本类型Integer/String的包装器对象在那里有点毒。 也就是说,我们将ping字符串抽入的值T对于反序列化引擎找出它期望读出的对象没有帮助。

所以从技术上讲,ping服务对于客户端代码来说并不是微不足道的。

就这样说,我现在在Weblogic和Wildfly上有两种截然不同的行为。 而且它们的不同必须与每个正在使用的序列化技术直接相关。

当WebLogic上执行Ping的服务,现在,该效应初探对象,我得到的形式为:

{“值”:{“类型”:“串”,“价值”: “平安服务调用成功 2017-08-12T09:08:45.455Z”}}

所以你看,无论ObjectMapper weblogic的使用,而且我绝对没有配置,默认情况下,抽额外的元数据取消T值,即将其声明为一个字符串。 (a)这非常可爱,没有我的要求就完成了,但是在客户端,我需要创建一个ObjectMapper来反序列化,这可以解释同一个对象medata。 最有可能的是有一组注解,例如@JsonInfo和@JsonSubtype,我可以添加到T值字段以使客户端的反序列化工作成功,但是就我写的DTO对象而言,没有要求任何这样的元数据出去。

(b)如果您知道杰克逊,您也会注意到对象上还缺少信息。 即,我没有看到我的对象的类=“full.qualified.name”。 但是我已经确定我要求这个元数据通过将这个注解加入到课堂中来响应json。

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = As.PROPERTY, property = "class") 

所以在这里我的问题是: (1)什么库究竟是采用序列化的json (2)做什么默认配置,他们在那里 (3)我已经抽了我的聚甲醛的WebLogic。 xml是最初使我的端点工作的“jackson-jaxrs-json-provider”依赖关系。 我看了这个库的源代码,它看起来像我这个库试图负责json响应的渲染。它有一个CDI @Provide @Consumes(/)产生(/),如果我启用调试器,我可以在部署期间看到jackson-jaxrs-json-provider被调用。

我在weblogic中看不到的是这个类的ObjectMapper被调用。 它是如果我不能覆盖现在掌管的任何默认行为。

有没有人了解这种行为。 有没有办法把这只野兽放在皮带上并控制局势? 还是我的代码大事化小到这种程度在我的字符串包装的对象被命名为” StringWrappedDto和值字段trviailized成字符串值。 我希望不会,但现在我有这个挣扎。

(a)如果你只用RestApplication和Endpoint来部署一个WAR,那么我可以使用Wildfly 10.1.0.0.1.0.0.1.0.0,我的经验是根据期望,事情会变得更加有趣

(a) 开箱即用 没有麻烦,没有任何无法呈现应用程序/ json的消息 您已准备好开始工作,控制任何配置。 (b)如果你想要重写Json的渲染行为,你可以定义你自己的ObjectMapper提供者。 例如

public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> { 

    private final ObjectMapper mapper; 

    public ObjectMapperContextResolver() { 
     mapper = new ObjectMapper(); 
     mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> type) { 
     return mapper; 
    } 

} 

这个人在这里,如果你调试它,你可以看到它每次调用Ping服务都会被调用。 所以你可以负责如何将json响应序列化,如果你需要这样的控制级别的话。

最后,在wildfly,JSON响应我得到的是什么,我希望在下面的报价说明:

{ “类”: “entrypoint.rest.BasicJsonResponse”, “值”:” Ping服务 成功调用2017-08-12T16:42:13。788Z“}

我试图从杰克逊2几乎每一个克拉森所涉及的数据序列化和literrally没有被击中WebLogic上设置断点。 所以我很肯定,事中的wlserver的/模块已经习惯

任何人有如何强制声明为依赖战争jackson2一个主意,让用于serializaton并杀死任何默认行为是正确的,现在正在发生

- ? 现在正在开始清楚在渲染中发生了什么 I写了下面的单元测试作为一个实验:

@Test 
    public void serializeJerseyTest() throws JsonProcessingException, JAXBException { 
     // (a) class to be marshalled into json 
     BasicJsonResponseDto<String> objectToSerialize = new BasicJsonResponseDto<String>(
       "Ping-service invoked successfully. " + Instant.now().toString()); 

     // (b) setup a jaxbcontext 
     Map<String, Object> properties = new HashMap<String, Object>(3); 
     JAXBContext jc = JAXBContext.newInstance(BasicStringJsonResponseDto.class); 

     // (c) Marshall to system out 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.setProperty("eclipselink.media-type", "application/json"); 
     marshaller.setProperty("eclipselink.media-type", "application/json"); 
     marshaller.marshal(objectToSerialize, System.out); 
    } 

而且单元测试看起来相当熟悉的输出...

{ 
    "value" : { 
     "type" : "string", 
     "value" : "Ping-service invoked successfully. 2017-08-12T19:33:05.834Z" 
    } 

Oracle正在使用莫西使JSON ... 所以现在的问题是,我该如何使用jackson2呢?

我相信有一种方法。可以在球衣文档中找到,我相信默认情况下会使用Moxy。

对于将来的参考,我现在将发布一个说明卷的调试堆栈跟踪。 所有的代码,我试图调试,并不能找出如何,因为我是时候试图设置杰克逊的断点,当执行是泽西+ moxy一直。 所以这里是答案。

我来到这个堆栈跟踪世界上最荒谬的原因。 Moxy开箱即可反序列化它为此Web服务生成的JSON对象。 任何人都可以理解这一点吗? moxy正在序列化POJO中的som json,但unmarshall无法正确解除值域? 因此,这里是堆栈跟踪:

Daemon Thread [[ACTIVE] ExecuteThread: '4' for queue: 'weblogic.kernel.Default (self-tuning)'] (Suspended (breakpoint at line 51 in entrypoint.rest.ObjectAdapter)) 
    entrypoint.rest.ObjectAdapter.marshal(java.lang.Object) line: 51  
    entrypoint.rest.ObjectAdapter.marshal(java.lang.Object) line: 1 
    org.eclipse.persistence.internal.jaxb.XMLJavaTypeConverter.convertObjectValueToDataValue(java.lang.Object, org.eclipse.persistence.sessions.Session, org.eclipse.persistence.oxm.XMLMarshaller) line: 178 
    org.eclipse.persistence.oxm.mappings.XMLAnyObjectMapping.convertObjectValueToDataValue(java.lang.Object, org.eclipse.persistence.sessions.Session, org.eclipse.persistence.oxm.XMLMarshaller) line: 652 
    org.eclipse.persistence.oxm.mappings.XMLAnyObjectMapping.convertObjectValueToDataValue(java.lang.Object, org.eclipse.persistence.core.sessions.CoreSession, org.eclipse.persistence.internal.oxm.Marshaller) line: 1  
    org.eclipse.persistence.internal.oxm.XMLAnyObjectMappingNodeValue.marshalSingleValue(org.eclipse.persistence.internal.oxm.XPathFragment, org.eclipse.persistence.internal.oxm.record.MarshalRecord, java.lang.Object, java.lang.Object, org.eclipse.persistence.internal.core.sessions.CoreAbstractSession, org.eclipse.persistence.internal.oxm.NamespaceResolver, org.eclipse.persistence.internal.oxm.record.MarshalContext) line: 72  
    org.eclipse.persistence.internal.oxm.XMLAnyObjectMappingNodeValue.marshal(org.eclipse.persistence.internal.oxm.XPathFragment, org.eclipse.persistence.internal.oxm.record.MarshalRecord, java.lang.Object, org.eclipse.persistence.internal.core.sessions.CoreAbstractSession, org.eclipse.persistence.internal.oxm.NamespaceResolver, org.eclipse.persistence.internal.oxm.record.MarshalContext) line: 65 
    org.eclipse.persistence.internal.oxm.XMLAnyObjectMappingNodeValue(org.eclipse.persistence.internal.oxm.NodeValue).marshal(org.eclipse.persistence.internal.oxm.XPathFragment, org.eclipse.persistence.internal.oxm.record.MarshalRecord, java.lang.Object, org.eclipse.persistence.internal.core.sessions.CoreAbstractSession, org.eclipse.persistence.internal.oxm.NamespaceResolver, org.eclipse.persistence.internal.oxm.record.MarshalContext, org.eclipse.persistence.internal.oxm.XPathFragment) line: 102  
    org.eclipse.persistence.internal.oxm.record.ObjectMarshalContext.marshal(org.eclipse.persistence.internal.oxm.NodeValue, org.eclipse.persistence.internal.oxm.XPathFragment, org.eclipse.persistence.internal.oxm.record.MarshalRecord, java.lang.Object, org.eclipse.persistence.internal.core.sessions.CoreAbstractSession, org.eclipse.persistence.internal.oxm.NamespaceResolver, org.eclipse.persistence.internal.oxm.XPathFragment) line: 59 
    org.eclipse.persistence.internal.oxm.XPathNode.marshal(org.eclipse.persistence.internal.oxm.record.MarshalRecord, java.lang.Object, org.eclipse.persistence.internal.core.sessions.CoreAbstractSession, org.eclipse.persistence.internal.oxm.NamespaceResolver, org.eclipse.persistence.internal.oxm.Marshaller, org.eclipse.persistence.internal.oxm.record.MarshalContext, org.eclipse.persistence.internal.oxm.XPathFragment) line: 443 
    org.eclipse.persistence.internal.oxm.XPathObjectBuilder.buildRow(org.eclipse.persistence.internal.oxm.record.XMLRecord, java.lang.Object, org.eclipse.persistence.internal.core.sessions.CoreAbstractSession, org.eclipse.persistence.internal.oxm.Marshaller, org.eclipse.persistence.internal.oxm.XPathFragment) line: 243  
    org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(org.eclipse.persistence.internal.oxm.record.XMLRecord, java.lang.Object, org.eclipse.persistence.internal.core.sessions.CoreAbstractSession, org.eclipse.persistence.internal.oxm.XMLMarshaller, org.eclipse.persistence.internal.oxm.XPathFragment) line: 118 
    org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(org.eclipse.persistence.internal.oxm.record.XMLRecord, java.lang.Object, org.eclipse.persistence.internal.core.sessions.CoreAbstractSession, org.eclipse.persistence.internal.oxm.Marshaller, org.eclipse.persistence.internal.oxm.XPathFragment) line: 1 
    org.eclipse.persistence.oxm.XMLMarshaller(org.eclipse.persistence.internal.oxm.XMLMarshaller<ABSTRACT_SESSION,CHARACTER_ESCAPE_HANDLER,CONTEXT,DESCRIPTOR,MARSHALLER_LISTENER,MEDIA_TYPE,NAMESPACE_PREFIX_MAPPER,OBJECT_BUILDER,SESSION>).marshal(java.lang.Object, org.eclipse.persistence.oxm.record.MarshalRecord, ABSTRACT_SESSION, DESCRIPTOR, boolean) line: 766 
    org.eclipse.persistence.oxm.XMLMarshaller(org.eclipse.persistence.internal.oxm.XMLMarshaller<ABSTRACT_SESSION,CHARACTER_ESCAPE_HANDLER,CONTEXT,DESCRIPTOR,MARSHALLER_LISTENER,MEDIA_TYPE,NAMESPACE_PREFIX_MAPPER,OBJECT_BUILDER,SESSION>).marshalStreamOrWriter(java.lang.Object, org.eclipse.persistence.oxm.record.MarshalRecord, ABSTRACT_SESSION, DESCRIPTOR, boolean) line: 1147 
    org.eclipse.persistence.oxm.XMLMarshaller(org.eclipse.persistence.internal.oxm.XMLMarshaller<ABSTRACT_SESSION,CHARACTER_ESCAPE_HANDLER,CONTEXT,DESCRIPTOR,MARSHALLER_LISTENER,MEDIA_TYPE,NAMESPACE_PREFIX_MAPPER,OBJECT_BUILDER,SESSION>).marshal(java.lang.Object, java.io.OutputStream, ABSTRACT_SESSION, DESCRIPTOR) line: 934 
    org.eclipse.persistence.oxm.XMLMarshaller(org.eclipse.persistence.internal.oxm.XMLMarshaller<ABSTRACT_SESSION,CHARACTER_ESCAPE_HANDLER,CONTEXT,DESCRIPTOR,MARSHALLER_LISTENER,MEDIA_TYPE,NAMESPACE_PREFIX_MAPPER,OBJECT_BUILDER,SESSION>).marshal(java.lang.Object, java.io.OutputStream) line: 877 
    org.eclipse.persistence.jaxb.JAXBMarshaller.marshal(java.lang.Object, java.io.OutputStream) line: 496 
    org.glassfish.jersey.moxy.json.internal.ConfigurableMoxyJsonProvider(org.eclipse.persistence.jaxb.rs.MOXyJsonProvider).writeTo(java.lang.Object, java.lang.Class<?>, java.lang.reflect.Type, java.lang.annotation.Annotation[], javax.ws.rs.core.MediaType, javax.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.Object>, java.io.OutputStream) line: 957 
    org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(javax.ws.rs.ext.WriterInterceptorContext, javax.ws.rs.ext.MessageBodyWriter) line: 265 
    org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(javax.ws.rs.ext.WriterInterceptorContext) line: 250 
    org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed() line: 162 
    org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(javax.ws.rs.ext.WriterInterceptorContext) line: 106 
    org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed() line: 162 
    org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(javax.ws.rs.ext.WriterInterceptorContext) line: 86 
    org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed() line: 162 
    weblogic.jaxrs.server.internal.ChunkedOutputWriter.aroundWriteTo(javax.ws.rs.ext.WriterInterceptorContext) line: 65 
    org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed() line: 162 
    org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(java.lang.Object, java.lang.Class<?>, java.lang.reflect.Type, java.lang.annotation.Annotation[], javax.ws.rs.core.MediaType, javax.ws.rs.core.MultivaluedMap<java.lang.String,java.lang.Object>, org.glassfish.jersey.internal.PropertiesDelegate, java.io.OutputStream, java.lang.Iterable<javax.ws.rs.ext.WriterInterceptor>) line: 1130 
    org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(org.glassfish.jersey.server.ContainerResponse) line: 711 
    org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(org.glassfish.jersey.server.ContainerResponse) line: 444  
    org.glassfish.jersey.server.ServerRuntime$Responder.process(org.glassfish.jersey.server.ContainerResponse) line: 434  
    org.glassfish.jersey.server.ServerRuntime$2.run() line: 329 
    org.glassfish.jersey.internal.Errors$1.call() line: 271 
    org.glassfish.jersey.internal.Errors$1.call() line: 267 
    org.glassfish.jersey.internal.Errors.process(java.util.concurrent.Callable<T>, boolean) line: 315 
    org.glassfish.jersey.internal.Errors.process(org.glassfish.jersey.internal.util.Producer<T>, boolean) line: 297 
    org.glassfish.jersey.internal.Errors.process(java.lang.Runnable) line: 267 
    org.glassfish.jersey.process.internal.RequestScope.runInScope(org.glassfish.jersey.process.internal.RequestScope$Instance, java.lang.Runnable) line: 317  
    org.glassfish.jersey.server.ServerRuntime.process(org.glassfish.jersey.server.ContainerRequest) line: 305 
    org.glassfish.jersey.server.ApplicationHandler.handle(org.glassfish.jersey.server.ContainerRequest) line: 1154 
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(java.net.URI, java.net.URI, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 471 
    org.glassfish.jersey.servlet.WebComponent.service(java.net.URI, java.net.URI, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 425 
    org.glassfish.jersey.servlet.ServletContainer.service(java.net.URI, java.net.URI, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 383 
    org.glassfish.jersey.servlet.ServletContainer.service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 336 
    org.glassfish.jersey.servlet.ServletContainer.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) line: 223  
    weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run() line: 286 
    weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run() line: 260 
    weblogic.servlet.internal.StubSecurityHelper.invokeServlet(javax.servlet.ServletRequest, javax.servlet.http.HttpServletRequest, weblogic.servlet.internal.ServletRequestImpl, javax.servlet.ServletResponse, javax.servlet.http.HttpServletResponse, javax.servlet.Servlet) line: 137 
    weblogic.servlet.internal.ServletStubImpl.execute(javax.servlet.ServletRequest, javax.servlet.ServletResponse, weblogic.servlet.internal.FilterChainImpl) line: 350 
    weblogic.servlet.internal.TailFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) line: 25 
    weblogic.servlet.internal.FilterChainImpl.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) line: 78  
    weblogic.servlet.internal.RequestEventsFilter.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) line: 32 
    weblogic.servlet.internal.FilterChainImpl.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) line: 78  
    weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(weblogic.servlet.internal.ServletStub, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 3683 
    weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run() line: 3649 
    weblogic.security.acl.internal.AuthenticatedSubject.doAs(weblogic.security.subject.AbstractSubject, java.security.PrivilegedAction) line: 326 
    weblogic.security.service.SecurityManager.runAsForUserCode(weblogic.security.acl.internal.AuthenticatedSubject, weblogic.security.acl.internal.AuthenticatedSubject, java.security.PrivilegedAction<T>) line: 197 
    weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(weblogic.security.acl.internal.AuthenticatedSubject, java.security.PrivilegedAction, weblogic.security.acl.internal.AuthenticatedSubject) line: 203 
    weblogic.servlet.provider.WlsSubjectHandle.run(java.security.PrivilegedAction) line: 71 
    weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(weblogic.servlet.internal.ServletInvocationContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, boolean, boolean, boolean) line: 2433  
    weblogic.servlet.internal.WebAppServletContext.securedExecute(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, boolean) line: 2281  
    weblogic.servlet.internal.WebAppServletContext.execute(weblogic.servlet.internal.ServletRequestImpl, weblogic.servlet.internal.ServletResponseImpl) line: 2259 
    weblogic.servlet.internal.ServletRequestImpl.runInternal() line: 1691 
    weblogic.servlet.internal.ServletRequestImpl.run() line: 1651 
    weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run() line: 270 
    weblogic.invocation.ComponentInvocationContextManager._runAs(weblogic.invocation.ComponentInvocationContext, java.lang.Runnable) line: 348 
    weblogic.invocation.ComponentInvocationContextManager.runAs(java.security.Principal, weblogic.invocation.ComponentInvocationContext, java.lang.Runnable) line: 333 
    weblogic.work.LivePartitionUtility.doRunWorkUnderContext(java.lang.Runnable, weblogic.invocation.ComponentInvocationContext) line: 54 
    weblogic.work.PartitionUtility.runWorkUnderContext(java.lang.Runnable, weblogic.invocation.ComponentInvocationContext) line: 41 
    weblogic.work.ServerWorkManagerImpl(weblogic.work.SelfTuningWorkManagerImpl).runWorkUnderContext(weblogic.work.ExecuteThread, weblogic.work.WorkAdapter) line: 640 
    weblogic.work.ExecuteThread.execute(weblogic.work.WorkAdapter) line: 406  
    weblogic.work.ExecuteThread.run() line: 346 

我相信我现在将搜索使用杰克逊WebLogic上的方法,根本就没有办法,我要被抽类完全解决此问题的工作的jaxB注释,最重要的是为此写入XmlAdapters。杰克逊可以免费完成这一切。 这就是为什么在需要时,杰克逊将编写@class属性和所有需要反序列化的类的元数据。 它根本不可能是这个坏。不可能是。

非常感谢。

那么,

Weblogic通过泽西岛实施JAX-RS。 根据球衣文档,它应该是一个简单的问题,将一个依赖项抽入你的部署中,以便从Moxy到Jackson的swtich。

E.g

<dependency> 
       <groupId>org.glassfish.jersey.media</groupId> 
       <artifactId>jersey-media-json-jackson</artifactId> 
       <version>2.26-b09</version> 
       <scope>runtime</scope> 
</dependency> 

参见下面的参考。 https://jersey.github.io/documentation/latest/media.html#json

似乎不是那么微不足道,要做转换,我的weblogic行为仍然反映了Moxy的用法,即使我曾将该库添加到球衣文档中。也许我尝试了错误的版本......今天我不会发现这一点。

既然老实说,我的耐心已经达到了这个小问题的极限。 我决定顺应潮流。将Jersey留给默认行为吧让Moxy。我不会妨碍。

我发现Moxy比jackson更冗长,而且我并不特别喜欢像蘑菇那样在jaxb.properties文件中传播包含其余DTOS的文件夹。

jaxb.properties例如:

javax.xml.bind.context.factory的= org.eclipse.persistence.jaxb.JAXBContextFactory

在任何情况下,现在我想一致性存在于Weblogic和Wildfly之间的休息呼叫的结果之间。没有办法,我会写如果应用程序服务器是Weblogic反序列化与A,如果它野蛮反序列化与B。没办法!

所以我做的很简单。

蜻蜓使用restEasy。休息容易很简单! :)

所以我只是去我的web.xml

而且抽了以下信息:

<context-param> 
      <param-name>resteasy.providers</param-name> 
      <param-value>org.eclipse.persistence.jaxb.rs.MOXyJsonProvider</param-value> 
</context-param> 

感谢RestEasy的文档,这是真正的帮助!

最后,由于我总是使用EclipseLink而不是Hibernate,因此当我启动wildfly时,eclipselink模块已经处于活动状态。无需通过jboss-deployment descriptor.xml激活它。

但是,该模块缺乏足够的元数据。 我不得不泵入模块“org.eclipse.persistence”的main.xml以下依赖性:

<module name="javax.ws.rs.api" /> 

这意味着我的模块如下所示:

<module xmlns="urn:jboss:module:1.3" name="org.eclipse.persistence"> 
    <properties> 
     <property name="jboss.api" value="private"/> 
    </properties> 

    <resources> 
     <resource-root path="jipijapa-eclipselink-10.1.0.Final.jar"/> 
      <resource-root path="eclipselink-2.6.4.jar">   
      <filter> 
       <exclude path="javax/**" /> 
      </filter> 
     </resource-root>   
    </resources> 

    <dependencies> 
     <module name="asm.asm"/> 
     <module name="javax.api"/> 
     <module name="javax.annotation.api"/> 
     <module name="javax.enterprise.api"/> 
     <module name="javax.persistence.api"/> 
     <module name="javax.transaction.api"/> 
     <module name="javax.validation.api"/> 
     <module name="javax.xml.bind.api"/> 
     <module name="org.antlr"/> 
     <module name="org.dom4j"/> 
     <module name="org.javassist"/> 
     <module name="org.jboss.as.jpa.spi"/> 
     <module name="org.jboss.logging"/> 
     <module name="org.jboss.vfs"/> 

     <!-- Add dependency on rest api --> 
     <module name="javax.ws.rs.api" /> 
    </dependencies> 
</module> 

注: 只是要小心维护这些信息,你想自动化黑客这些文件,因为随着时间的流逝,你会失去这些信息。

最好是你创建一个野蛮的安装程序,给定一个香草拉链做你所有的hacky调谐到基本元数据文件,否则你会丢失。

无论如何,现在Wildfly正在渲染基于Moxy的休息调用输出,而不是基于Jackson。

这意味着我将不得不重构我的休息客户端是基于Moxy的,但老实说... 我精力充沛,无法与weblogic抗争。

我更喜欢杰克逊,使用起来更加简单快捷,但是嘿...选择你的战斗吧?

+0

哦,太棒了!它看起来像moxy不能反序列化它正在序列化的数据。最有可能现在能够解组这个类型的对象,我将*在参数化类型字段上创建某种ObjectAdapter ....谈论昂贵的样板代码。一言以蔽之,这是莫言。 – 99Sono

+0

我目前正在做Moxy在客户端和服务器端都是weblogic和wildfly。我这样做是因为在weblogic上,你不能轻易覆盖泽西岛的行为并强迫它使用杰克逊。要做到这一点,人们必须将完整的泽西实现放入WAR中,并遵循oracle的升级泽西指南。然后泽西文件解释了如何从Moxy转移到杰克逊的工作。但人们可以说 - 杰克逊,就像Gson一样,图书馆使得Moxy更容易渲染类并反序列化为json。这并不理想。 – 99Sono