【问题标题】:Spring Boot - Caused by: java.lang.UnsupportedClassVersionError: org/glassfish/jersey/server/ResourceConfig : unsupported classversion 51.0Spring Boot - 引起:java.lang.UnsupportedClassVersionError:org/glassfish/jersey/server/ResourceConfig:不支持的classversion 51.0
【发布时间】:2016-02-20 11:44:50
【问题描述】:

我正在为我的应用程序使用 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>

【问题讨论】:

  • “我不想使用 java 1.7”。 Java 7 及以下版本是“生命终结”,因此您应该将 Java 8 用于任何新项目。
  • 我了解它的生命周期结束,但我的公司还没有升级到 java 8 :(

标签: spring maven spring-boot jersey


【解决方案1】:

Jersey 2.7 及更高版本是使用 Java 7 编译的。因此,如果要使用 Java 6,则需要使用 Jersey 2.6。所以你需要摆脱泽西首发

<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 start pom 中使用的jersey-media-json-jackson,我们不能使用它,除非你想坚持使用 Jackson 1.9。因此,我们只需要引入底层的 Jackson 提供程序 jackson-jaxrs-json-provider。我们使用的版本与 Spring Boot bom 中的 Jackson 版本相同。

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

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 中设置&lt;jersey.version&gt;2.6&lt;/jersey.version&gt; 属性。但如果你想使用 Jackson 2,只需排除 jersey-media-json-jackson(因为 Jersey 2.6 pulls 使用 Jackson 1.9.3),只需包含上面提到的 jackson-jaxrs-json-provider,然后按照其余说明进行配置。

【讨论】:

  • 您可以在 pom 的 &lt;properties&gt; 部分中覆盖 jersey.version 属性,而不是复制 starter-jersey pom 的内容
猜你喜欢
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2017-08-14
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多