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 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 引导站点上,我找不到适合 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
,然后按照其余说明进行配置它。
我正在为我的应用程序使用 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 引导站点上,我找不到适合 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.
您唯一需要做的另一件事是配置对 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
,然后按照其余说明进行配置它。