【问题标题】:How to get Glassfish 4.1.1 and Jersey to work with JSON?如何让 Glassfish 4.1.1 和 Jersey 使用 JSON?
【发布时间】:2016-11-24 20:02:50
【问题描述】:

几天来,我试图让 Glassfish 4.1.1 和 Jersey 一起工作。棘手的部分是当通过 JSON 进行通信时。

我尝试了许多解决方案来使 JSON 数据传输正常工作。唉,还是不行。

Glassfish 和 Jersey 是“标准”,所以我想有一种标准方法可以将这两者结合起来吗?配置 JSON 的正确方法是什么?

每当我开始使用 JSON 时,都会遇到各种错误。 我得到的最后一个错误:

     2016-11-25T15:59:52.070+0100|Warning: StandardWrapperValve[Jersey Web Application]: Servlet.service() for servlet Jersey Web Application threw exception
java.lang.ClassNotFoundException: javax.xml.parsers.ParserConfigurationException not found by org.eclipse.persistence.moxy [228]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
etc, etc. 

maven依赖有:

http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>nl.xyz</groupId>
<artifactId>GlassfishJerseyJson</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>GlassfishJerseyJson</name>

<build>
    <finalName>GlassfishJerseyJson</finalName>
    <plugins>
            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
                <!-- <webXml>src\main\webapp\WEB-INF\web.xml</webXml> -->
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.glassfish.maven.plugin</groupId>
            <artifactId>maven-glassfish-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <glassfishDirectory>${local.glassfish.home}</glassfishDirectory>
                <user>admin</user>
                <passwordFile>${local.glassfish.passfile}</passwordFile>
                <domain>
                    <name>domain1</name>
                    <httpPort>8080</httpPort>
                    <adminPort>4848</adminPort>
                </domain>
                <components>
                    <component>
                        <name>${project.artifactId}</name>
                        <artifact>target/${project.build.finalName}.war</artifact>
                    </component>
                </components>
                <debug>true</debug>
                <terse>false</terse>
                <echo>true</echo>
            </configuration>
        </plugin>
    </plugins>
</build>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.glassfish.jersey</groupId>
                <artifactId>jersey-bom</artifactId>
                <version>${jersey.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>javax</groupId> 
            <artifactId>javaee-web-api</artifactId> 
            <version>7.0</version> 
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId> 
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.6.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.6.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.5.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
    <properties>
        <jersey.version>2.24.1</jersey.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

JQuery 调用是:

function findResource() {
    $.ajax({
        type: 'GET',
        accepts: { json: "application/json, text/javascript" }, 
        dataType: "json",
        url: resourceURL, 
        success: function(data){
            alert( "Back from resource: name=" + data.name); 
        }, 
        error: function(jqXHR, textStatus, errorThrown){
            alert('Back from resource error: ' + textStatus + ' - Error: ' + errorThrown + " - Response: " + jqXHR.responseText);
        }
    });
}

资源java文件:

@Path("myresource")
public class MyResource {
     @GET
     @Produces( MediaType.APPLICATION_JSON)
     public Wine2 getIt() {
         Wine2 w = new Wine2();
         w.setId( 100);
         w.setCountry( "france");
         return w;
     }
} 

配置:选项1:web.xml(保留默认的第一行):

<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">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>org.coenraets.cellar</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
</web-app>

配置:选项 2:MyApplication.java

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

public class MyApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add( MyResource.class);
        s.add( WineResource.class);
        return s;
    }
}

【问题讨论】:

  • 将您的资源注释更改为@Produces(MediaType.APPLICATION_JSON),即去掉大括号
  • 是的,我做到了。没有变化,同样的错误。

标签: java json maven jersey glassfish


【解决方案1】:

是的!!!!我找到了完整的答案。

解决方案是使用原始(见上文)maven 库并将 GLASSFISH/modules 文件夹中的以下文件更改为 2.5.0 版(或类似版本):

  • org.eclipse.persistence.moxy.jar
  • org.eclipse.persistence.core.jar

解决方案来自 [此网页][1] 和类似网站。

在这篇文章和其他文章中,$Glassfish/modules 中的 org.eclipse.persistence.moxy.jar 文件被替换为 2.5.0 版本。

【讨论】:

    【解决方案2】:

    只需使用以下内容而不是您的 moxy 依赖项:

        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.6.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.6.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.5.1</version>
            <scope>provided</scope>
        </dependency>
    

    这些库包含在标准 Glassfish 4 安装中,因此提供的范围就足够了。

    你应该移除这些依赖:

    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.0.2</version>
    </dependency>
    <dependency> 
        <groupId>javax.json</groupId> 
        <artifactId>javax.json-api</artifactId> 
        <version>1.0</version> 
        <scope>provided</scope>
    </dependency>
    

    和

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <!-- <version>2.4.1</version>
        <scope>provided</scope> -->
    </dependency>
    

    您不需要它们,大多数 Jersey 依赖项都可以设置为提供。

    如果你不让它工作:我用一个示例项目创建了a gist,它只有 4 个文件:pom.xml、web.xml、MyResource.class 和 Cow.class。这包括基本设置所需的一切,它可以在 Glassfish 4 上运行,无需任何额外的库。

    【讨论】:

    • 尝试找到这个类的用法并去掉。
    • 你在哪里使用这些类?你不需要它们。
    • 你是如何在项目中引入它们的?只是恢复它。您显示的代码没有使用这些类,因此运行项目不需要它们。你有一个扩展 ResourceConfig 的 Application.class 吗?
    • 那么你在项目的某处引用了moxy...它不会自动使用。
    • 我猜它来自你的 pom.xml 中的依赖管理部分。你绝对不需要,删除它。
    【解决方案3】:

    尝试添加库:Java EE7 API 库、JAX-RS、Jersey。

    【讨论】:

    【解决方案4】:

    您的解决方案可以是为您的 Jersey 应用程序提供自定义 JSON 提供程序。它的定义如下所示:

    import com.fasterxml.jackson.annotation.JsonAutoDetect;
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.PropertyAccessor;
    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
    
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    @Produces(MediaType.APPLICATION_JSON)
    public class CustomJsonProvider extends JacksonJaxbJsonProvider {
    
        private static final ObjectMapper MAPPER = new ObjectMapper();
    
        static {
            MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            MAPPER.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
            MAPPER.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.DEFAULT);
            MAPPER.enable(SerializationFeature.INDENT_OUTPUT);
         }
    
        public CustomJsonProvider() {
            super();
            setMapper(MAPPER);
        }
    }
    

    然后是一项将您的自定义 JSON 提供程序注册到 Jersey 应用程序上下文的功能:

    import javax.ws.rs.core.Feature;
    import javax.ws.rs.core.FeatureContext;
    import javax.ws.rs.ext.MessageBodyReader;
    import javax.ws.rs.ext.MessageBodyWriter;
    
    public class MarshallingFeature implements Feature {
    
        @Override
        public boolean configure(FeatureContext context) {
            context.register(CustomJsonProvider.class, MessageBodyReader.class, MessageBodyWriter.class);
            return true;
        }
    }
    

    最后,在 Jersey Application 类构造函数中注册该功能:

    import javax.ws.rs.ApplicationPath;
    import org.glassfish.jersey.server.ResourceConfig;
    
    @ApplicationPath("ws")
    public class ApplicationConfig extends ResourceConfig {
    
        public ApplicationConfig() {
    
            register(MarshallingFeature.class);
    
            // register ressource classes
        }
    }
    

    这些是您需要添加到 Maven pom.xml 中的依赖项:

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.0</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.2</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.8.6</version>
            <type>jar</type>
        </dependency>
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 2016-08-21
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      相关资源
      最近更新 更多