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

WebLogic部署返回List<String>的REST服务调用时出现运行时错误

解决WebLogic中REST服务返回List的JSON序列化问题

原因分析

WebLogic内置的Jersey默认缺少处理集合类型JSON序列化的MessageBodyWriter实现,导致返回List<String>时无法完成JSON格式转换,但单个String类型的返回可以正常处理。

解决方案

1. 添加Jackson JSON Provider依赖

如果用Maven管理项目,在pom.xml中添加Jackson与Jersey的集成依赖:

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.15.2</version> <!-- 选择与WebLogic兼容的版本 -->
    <scope>provided</scope> <!-- 若WebLogic已包含基础依赖,可设为provided -->
</dependency>

手动打包的话,把对应的Jackson jar包(jackson-jaxrs-json-provider、jackson-databind、jackson-core等)放入项目的WEB-INF/lib目录。

2. 注册Jackson Provider到Jersey

在自定义的Jersey Application类中注册JacksonJsonProvider:

import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;

public class MyRestApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<>();
        classes.add(YourRestResource.class); // 替换为你的REST资源类
        classes.add(JacksonJsonProvider.class);
        return classes;
    }
}

也可以在web.xml的Jersey Servlet配置中通过初始化参数添加:

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>
            com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider,
            com.yourpackage.YourRestResource
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

3. 调整WebLogic类加载顺序(可选)

如果WebLogic自带的Jackson版本和项目依赖冲突,可在WEB-INF/weblogic.xml中设置优先加载项目自身的类库:

<weblogic-web-app>
    <container-descriptor>
        <prefer-web-inf-classes>true</prefer-web-inf-classes>
    </container-descriptor>
</weblogic-web-app>

4. 封装List为自定义对象(替代方案)

如果不想引入额外依赖,可以把List<String>封装到简单POJO中再返回:

public class StringListResponse {
    private List<String> data;

    public StringListResponse(List<String> data) {
        this.data = data;
    }

    public List<String> getData() {
        return data;
    }

    public void setData(List<String> data) {
        this.data = data;
    }
}

然后修改REST方法的返回类型:

@GET
@Produces({ MediaType.APPLICATION_JSON })
@Path("/myway/mock")
public StringListResponse getMyMock(@QueryParam("pic") String pic, @QueryParam("year") int year) {
    List<String> result = new ArrayList<>();
    // 填充业务数据
    return new StringListResponse(result);
}

内容的提问来源于stack exchange,提问作者Sorin-Alexandru Cristescu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:55:04