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
相关产品推荐
相关产品推荐

