You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:50:20