Spring Boot - 引起:java.lang.UnsupportedClassVersionError:org / glassfish / jersey / server / ResourceConfig:不支持的classversion 51.0

时间:2016-02-20 11:44:51

标签: spring maven spring-boot jersey

我使用 Spring Boot spring-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启动网站上,我找不到合适版本的spring-boot-starter-jersey for java 1.6

以下是我的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>

1 个答案:

答案 0 :(得分:0)

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

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

所有的启动程序都会引入一堆依赖项,它不会以任何代码方式执行任何操作。因此,您真正需要做的就是用pom中的不同版本替换依赖项。如果您查看实际的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-media-json-jackson,我们无法使用它,除非您想要使用Jackson 1.9。因此,我们只需引入杰出的杰克逊提供者jackson-jaxrs-json-provider。我们使用的版本与Spring Boot bom中的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中设置属性<jersey.version>2.6</jersey.version>。但是如果你想使用Jackson 2,只要排除jersey-media-json-jackson(因为Jersey 2.6使用Jackson 1.9.3),并且只包括上面提到的jackson-jaxrs-json-provider,并按照其余的说明进行配置它