Spring Boot - Caused by: java.lang.UnsupportedClassVersionError: org/glassfish/jersey/server/ResourceConfig : unsupported classversion 51.0

Spring Boot - Caused by: java.lang.UnsupportedClassVersionError: org/glassfish/jersey/server/ResourceConfig : unsupported classversion 51.0

我正在为我的应用程序使用 Spring Bootspring-boot-starter-jersey

最初我在 Java 1.7 上工作,一切正常。

但是当我搬到 Java 1.6 时,它开始给我错误。

Caused by: java.lang.UnsupportedClassVersionError: 
org/glassfish/jersey/server/ResourceConfig : unsupported classversion 51.0

我不想使用 java 1.7。我怎样才能摆脱 java 1.6 中的这个错误。

此外,在 Spring 引导站点上,我找不到适合 java 1.6

spring-boot-starter-jersey 版本

下面是我的 POM

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.0.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <version>1.2.0.RELEASE</version>
    </dependency>       
</dependencies>
<properties>
    <tomcat.version>7.0.59</tomcat.version>
</properties>

Jersey 2.7 及更高版本是用 Java 7 编译的。所以如果你想使用 Java 6,你需要使用 Jersey 2.6。所以你需要去掉 Jersey starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jersey</artifactId>
</dependency>

启动器所做的只是引入一堆依赖项,它不会在代码方面做任何事情。所以你真正需要做的就是在你的 pom.xml 中用不同的版本替换依赖项。如果您查看实际的 pom for spring-boot-starter-jersey,您可以看到它引入的所有内容。下面是您应该添加的内容的修订版本以代替 spring-boot-starter-jersey

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring3</artifactId>
    <version>${jersey.version}</version>
    <exclusions> 
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId> 
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId> 
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId> 
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId> 
        </exclusion> 
    </exclusions>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.4.4</version>
</dependency>

{jersey.version} 是 2.6.

一些不同之处在于我从 jersey-spring3 中排除了所有 Spring。我这样做是因为你已经用 spring-boot-starter-web.

把所有东西都拉进去了

还有 Jersey 启动 pom 中使用的 jersey-media-json-jackson,我们不能使用它,除非您想坚持使用 Jackson 1.9。因此,我们只是引入底层的 Jackson 提供者 jackson-jaxrs-json-provider。我们使用的版本与 Spring Boot bom.

中的 Jackson 版本相同

您唯一需要做的另一件事是配置对 Jersey 的 Jackson 支持,这仅包括注册提供者。您可以只使用以下功能。

import com.fasterxml.jackson.jaxrs.base.JsonMappingExceptionMapper;
import com.fasterxml.jackson.jaxrs.base.JsonParseExceptionMapper;
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
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 JacksonFeature implements Feature {

    @Override
    public boolean configure(FeatureContext context) {
        context.register(JsonParseExceptionMapper.class);
        context.register(JsonMappingExceptionMapper.class);
        context.register(JacksonJaxbJsonProvider.class,
                         MessageBodyReader.class, MessageBodyWriter.class);
        return true;
    }
}

只需使用您的 ResourceConfig...register(JacksonFeature.class).

注册即可

确实如此,一切都应该还是一样的。自动配置应该仍然完好无损。我对它进行了测试,不是很严格,但可以用于简单的启动。

更新

或者正如@Andy Wilkinson 所建议的那样,您可以保留 spring-boot-starter-jersey,并在您的 pom.xml 文件中设置 属性 <jersey.version>2.6</jersey.version>。但是如果你想使用 Jackson 2,只需排除 jersey-media-json-jackson(因为 Jersey 2.6 pulls 使用 Jackson 1.9.3),并且只包含上面提到的 jackson-jaxrs-json-provider,然后按照其余说明进行配置它。