简体   繁体   English

如何配置 Glassfish 5 以使用 Moxy 作为默认提供程序?

[英]How do I configure Glassfish 5 to use Moxy as the default Provider?

I'm migrating our web application from Glassfish 3 to Glassfish 5, and during the migration I ran across this error for a request.我正在将我们的 web 应用程序从 Glassfish 3 迁移到 Glassfish 5,在迁移过程中,我遇到了这个错误以获取请求。

[2019-09-17T15:57:30.732-0600] [glassfish 5.0] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=241 _ThreadName=http-listener-2(27)] [timeMillis: 1568757450732] [levelValue: 900] [[
 StandardWrapperValve[ClientControllers]: Servlet.service() for servlet ClientControllers threw exception
java.lang.ClassCastException: [Z cannot be cast to [Ljava.lang.Object;
   at org.eclipse.yasson.internal.serializer.ObjectArraySerializer.serializeInternal(ObjectArraySerializer.java:27)
   at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60)
   at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:91)
   at org.eclipse.yasson.internal.serializer.ObjectSerializer.marshallProperty(ObjectSerializer.java:92)
   at org.eclipse.yasson.internal.serializer.ObjectSerializer.serializeInternal(ObjectSerializer.java:59)
   at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60)
   at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:91)
   at org.eclipse.yasson.internal.serializer.ObjectArraySerializer.serializeInternal(ObjectArraySerializer.java:46)
   at org.eclipse.yasson.internal.serializer.ObjectArraySerializer.serializeInternal(ObjectArraySerializer.java:27)
   at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60)
   at org.eclipse.yasson.internal.Marshaller.serializeRoot(Marshaller.java:118)
   at org.eclipse.yasson.internal.Marshaller.marshall(Marshaller.java:76)
   at org.eclipse.yasson.internal.JsonBinding.toJson(JsonBinding.java:98)
   at org.glassfish.jersey.jsonb.internal.JsonBindingProvider.writeTo(JsonBindingProvider.java:118)
   at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:266)
   at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:251)
   at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:163)
   at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:109)
   at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:163)
   at org.glassfish.jersey.spi.ContentEncoder.aroundWriteTo(ContentEncoder.java:137)
   at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:163)
   at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:85)
   at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:163)
   at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1135)
   at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:662)
   at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:395)
   at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:385)
   at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:280)
   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.core.StandardPipeline.doInvoke(StandardPipeline.java:652)
   at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:591)
   at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:368)
   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$1.run(HttpHandler.java:224)
   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)
]]

It appears Glassfish 5 is using JSON-B serialization. Glassfish 5 似乎正在使用 JSON-B 序列化。 Glassfish 5 ignores JAXB @XmlJavaTypeAdapter annotation? Glassfish 5 忽略 JAXB @XmlJavaTypeAdapter 注释?

In the past we used moxy and jaxb for json binding, and as a result I've been trying to register Moxy as the default provider in Glassfish 5. I've followed the instructions here with no luck.过去,我们使用 moxy 和 jaxb 进行 json 绑定,因此我一直在尝试将 Moxy 注册为 Glassfish 5 中的默认提供程序。我按照此处的说明进行操作,但没有运气。

https://howtodoinjava.com/jersey/jax-rs-jersey-moxy-json-example/ https://howtodoinjava.com/jersey/jax-rs-jersey-moxy-json-example/

I also read the Glassfish 5 documentation, but did not find any similar examples for registering a default provider.我还阅读了 Glassfish 5 文档,但没有找到任何类似的注册默认提供程序的示例。 If someone could shed some light on what I'm doing wrong in the configuration that would be greatly appreciated.如果有人可以阐明我在配置中做错了什么,将不胜感激。 I've provided samples of my configuration below.我在下面提供了我的配置示例。

How do I configure Glassfish 5 to use Moxy as the default Provider?如何配置 Glassfish 5 以使用 Moxy 作为默认提供程序?

Notes:笔记:

  • When I start glassfish, I've debugged the JsonServicesContextResolver.java class and verified the constructor and getContext method are hit during initialization.当我启动 glassfish 时,我已经调试了 JsonServicesContextResolver.java class 并验证了构造函数和 getContext 方法在初始化期间被命中。
  • I've tried removing the GridApplication.java class and removing its references in the web.xml, thinking the jersey.config.server.provider.packages may already register any providers in those packages. I've tried removing the GridApplication.java class and removing its references in the web.xml, thinking the jersey.config.server.provider.packages may already register any providers in those packages. I still had the same errors.我仍然有同样的错误。

JsonServicesContextResolver.java JsonServicesContextResolver.java

package com.lnka.eng.grid.jersey;

import org.eclipse.persistence.jaxb.JAXBContextProperties;
import org.glassfish.jersey.moxy.json.MoxyJsonConfig;

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
public class JsonServicesContextResolver
    implements ContextResolver<MoxyJsonConfig>
{
  private MoxyJsonConfig config;

  public JsonServicesContextResolver()
  {
    config = new MoxyJsonConfig()
        .setNamespaceSeparator(':')
        .setAttributePrefix("")
        .setValueWrapper("value")
        .property(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, true)
        .setFormattedOutput(true)
        .setIncludeRoot(true)
        .setMarshalEmptyCollections(true);
  }

  @Override
  public MoxyJsonConfig getContext(Class<?> objectType)
  {
    return config;
  }
}

ProgramsController.java程序Controller.java

package com.lnka.eng.view.controller;

@Path("/mgmt/programs/")
@Stateless
@Transactional(Transactional.TxType.NOT_SUPPORTED)
public class ProgramsController extends Controller
{
 @GET
  @Path("/list/")
  @Produces(MediaType.APPLICATION_JSON)
  public Response getProgramsList()
  {
    List<Program> programs = getPrograms();

    return Response.ok(programs).build();    
  }
}

GridApplication.java GridApplication.java

package com.lnka.eng.grid.jersey;

import com.lnka.eng.view.controller.ProgramsController;

import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;

public class GridApplication extends Application
{
  //Add Service APIs
  @Override
  public Set<Class<?>> getClasses()
  {
    Set<Class<?>> resources = new HashSet<Class<?>>();

    //register REST modules
    resources.add(ProgramsController.class);

    //Manually adding MOXyJSONFeature
    resources.add(org.glassfish.jersey.moxy.json.MoxyJsonFeature.class);

    //Configure Moxy behavior
    resources.add(JsonServicesContextResolver.class);

    return resources;
  }
}

web.xml web.xml

I've removed some of the config in this file that I thought irrelevant (security, ejb config, etc)我已经删除了这个文件中一些我认为不相关的配置(安全、ejb 配置等)

<web-app version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name>Grid</display-name>  
  <servlet>
    <servlet-name>JerseyServiceApplications</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>javax.ws.rs.core.Application</param-name>
      <param-value>com.lnka.eng.grid.jersey.GridApplication</param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>com.lnka.eng.grid.service;com.lnka.eng.grid.jersey</param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.provider.classnames</param-name>
      <param-value>org.glassfish.jersey.message.GZipEncoder</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
    <servlet-name>ClientControllers</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>javax.ws.rs.core.Application</param-name>
      <param-value>com.lnka.eng.grid.jersey.GridApplication</param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>
        com.lnka.eng.view.controller,
        com.lnka.eng.grid.jersey
      </param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.provider.classnames</param-name>
      <param-value>
        org.glassfish.jersey.message.GZipEncoder
      </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>ClientControllers</servlet-name>
    <url-pattern>/client/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>JerseyServiceApplications</servlet-name>
    <url-pattern>/resources/*</url-pattern>
  </servlet-mapping>

  <session-config>
    <session-timeout>480</session-timeout>
  </session-config>
</web-app>

The issue was we needed to update the web.xml to include the MoxyConfig in the session-config scope.问题是我们需要更新 web.xml 以在会话配置 scope 中包含 MoxyConfig。 I was also missing some configuration for one of our listeners, but the relevant code is below.我还缺少我们的一位听众的一些配置,但相关代码如下。

The following was placed inside each of the <servlet>...</servlet> tags.以下内容放置在每个<servlet>...</servlet>标记内。

<init-param>
      <param-name>jersey.config.server.jsonFeature</param-name>
      <param-value>MoxyJsonFeature</param-value>
</init-param>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Glassfish JDBC:我只需要使用jdbc / __ default吗? - Glassfish JDBC: Do I have to use only jdbc/__default? 将Moxy设置为默认的jaxb实现提供程序 - Setting Moxy as default jaxb implementation provider 如何在Glassfish 3中为每个已部署的应用程序配置log4j? - How do I configure log4j per deployed application in Glassfish 3? 如何在java中配置和使用KStem? - How do I configure and use KStem in java? 如何在 MOXy 中使用实例化的 XmlAdapter? - How to use instantiated XmlAdapter in MOXy? Glassfish 3:我如何获得和使用开发人员构建,以便我可以浏览堆栈跟踪,包括Glassfish代码? - Glassfish 3: How do I get and use a developers build so I can navigate a stack trace including Glassfish code? 从命令行“ MVN安装”时,如何配置Maven Web应用程序以在Glassfish上自动部署? - How do I configure a maven web application to auto-deploy on glassfish when I “mvn install” from command line? 如何为Glassfish编写持久性提供程序 - How to write a persistence provider for Glassfish 如何在Spring中以编程方式配置JSR-330 @Provider和@Inject @Named(“ foo”)字符串? - How do I configure JSR-330 @Provider and @Inject @Named(“foo”) String **programmatically** in Spring? 如何在 Jersey 客户端中默认使用 Genson 提供程序? - How to use Genson provider as default in Jersey client?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM