当前位置: 首页 > 知识库问答 >
问题:

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

锺离正祥
2023-03-14

我正在将我们的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)
]]

Glassfish 5似乎正在使用JSON-B序列化。Glassfish 5忽略JAXB@XmlJavaTypeAdapter注释?

在过去,我们使用moxy和jaxb进行json绑定,因此我一直在尝试将moxy注册为Glassfish 5中的默认提供程序。我按照这里的指示做了,运气不好。

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

我还阅读了Glassfish 5文档,但没有找到任何注册默认提供者的类似示例。如果有人能解释一下我在配置中做错了什么,我们将不胜感激。我在下面提供了我的配置示例。

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

笔记:

  • 启动glassfish时,我已经调试了JsonServicesContextResolver。java类并验证了构造函数和getContext方法在初始化过程中被命中

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;
  }
}

程序控制器。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();    
  }
}

网格应用程序。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;
  }
}

网状物xml

我已经删除了这个文件中一些我认为不相关的配置(安全性、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>

共有1个答案

缑泓
2023-03-14

问题是我们需要更新web.xml以将MoxyConfig包含在会话配置范围中。我还缺少我们的一个侦听器的一些配置,但相关代码如下。

以下内容放置在每个

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

 类似资料:
  • 我试图使用maven发布插件来创建一个Java项目的发布版本,该项目将Performe作为SCM。 我的pom scm部分是: 我还使用P4Maven插件和Maven发布插件: 当调用“mvn release:prepare-DdryRun=true”时,我得到 有什么想法吗? 我可以调用mvn scm:checkout。

  • 问题内容: 为了使用Moxy作为JAXB实现,必须在具有应用程序域类的文件夹中添加一个名为jaxb.properties的文件,并包括以下行 是否可以将moxy设置为项目的默认值?如果我有许多带有带注释的域类的文件夹,我应该把这个文件放在哪个文件夹中? 问题答案: 注意: 我是 EclipseLink JAXB(MOXy)的 负责人,并且是 JAXB(JSR-222) 专家组的成员。 MOXy已经

  • 本文向大家介绍vagrant 在Vagrantfile中设置默认提供程序,包括了vagrant 在Vagrantfile中设置默认提供程序的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 标准中似乎没有规则提到模板参数需要默认参数的情况。 在dcl中。fct。默认值#1 如果在参数声明中指定了初始化子句,则将此初始化子句用作默认参数。缺省参数将用于缺少尾随参数的调用。 在本节中,规则明确描述了何时为函数调用提供默认参数。但是,我在标准中没有找到与上面描述何时提供默认参数作为模板参数的语句类似的引用。 例如

  • 如果我创建一个提供者并将其绑定到一个类,就像这样 然后

  • 我已在单独的Weblogic域中成功配置了SAML 2.0身份提供程序 我们在另一个域的Weblogic中部署了一个ADF应用程序,该应用程序具有非SAML基于表单的身份验证(ReadOnlySQLAuthenticator用于验证凭据) 我想将第二个域配置为服务提供者(以使现有应用程序能够使用身份提供者登录)。 我做了以下工作: 配置SAML 2.0 Identity Asserter 在服务器