@Produces(APPLICATION_JSON)在Uber Jar中未添加Content-Type的问题
问题分析与解决方案
根本原因
IDEA中运行正常但Uber Jar打包后出现415错误,核心原因是**maven-assembly-plugin打包时未正确合并Jersey JSON提供者的服务注册文件**:
- IDE运行时会自动合并类路径下所有
META-INF/services目录的内容,Jersey能正常找到JSON消息体的读取/写入器; maven-assembly-plugin仅简单复制文件,若多个Jar包含同名的服务注册文件(比如Jakarta JSON提供者的配置文件),后复制的文件会覆盖前者,导致Jersey无法加载JSON处理组件,只能尝试用默认的application/octet-stream处理请求,最终抛出415错误。
具体解决方案
1. 替换打包插件为maven-shade-plugin
shade插件支持合并META-INF/services下的文件,避免覆盖问题,修改pom.xml的build配置:
<build> <plugins> <!-- 移除原maven-assembly-plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 合并META-INF/services下的服务注册文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <!-- 指定主类,避免运行时找不到入口 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>你的主类全路径(比如com.example.Main)</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
2. 确保引入Jakarta版本的Jackson JSON依赖
由于是Jakarta应用,必须使用jakarta.rs命名空间的Jackson依赖,避免与旧的javax版本冲突:
<dependencies> <dependency> <groupId>com.fasterxml.jackson.jakarta.rs</groupId> <artifactId>jackson-jakarta-rs-json-provider</artifactId> <version>2.15.2</version> </dependency> </dependencies>
3. 手动注册JSON提供者(可选,兜底方案)
若自动扫描仍失效,可在主类中手动注册Jackson JSON组件,确保Jersey能找到它:
import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider; import org.glassfish.grizzly.http.server.HttpServer; import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; import org.glassfish.jersey.server.ResourceConfig; import java.net.URI; public class Main { public static void main(String[] args) { ResourceConfig config = new ResourceConfig() .packages("你的接口所在包路径") // 手动注册Jackson JSON处理提供者 .register(JacksonJsonProvider.class); HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create("http://localhost:8080"), config); server.start(); } }
4. 清理依赖冲突
用mvn dependency:tree命令检查依赖树,排除Hibernate等依赖中自带的旧javax版本组件,替换为Jakarta版本:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.15.Final</version> <exclusions> <exclusion> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> </exclusion> <exclusion> <groupId>javax.transaction</groupId> <artifactId>javax.transaction-api</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加Jakarta版本的对应依赖 --> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>jakarta.transaction</groupId> <artifactId>jakarta.transaction-api</artifactId> <version>1.3.3</version> </dependency>
内容的提问来源于stack exchange,提问作者reza ramezani matin
相关产品推荐
相关产品推荐

