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

在OpenLiberty的JAX-RS中为POST请求设置默认UTF-8编码

}

@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Transactional
@Produces("application/json; charset=UTF-8")
public Response updateFederalState(FederalState fs) {
...
}

## 当前运行环境
- OpenLiberty 23.0.0.11
- MicroProfile 6.0
- Jakarta EE 10.0.0
- JDK 17

## 示例请求(需显式指定charset才能正确解码变音符号)
```bash
curl -X 'POST' 'http://localhost:9080/geo/rest/fs' \
   -H 'accept: */*' \
   -H 'Content-Type: application/x-www-form-urlencoded;charset=utf-8' \
   -d 'name=Baden Würtemberg&shortName=BW'
解决方案

方法1:全局配置(推荐)

在OpenLiberty的server.xml中添加webContainer配置,全局设置表单请求的默认编码为UTF-8:

<webContainer defaultFormEncoding="UTF-8"/>

该配置会对所有application/x-www-form-urlencoded类型的POST请求生效,无需修改业务代码,直接解决默认编码问题。

方法2:自定义消息体读取器(细粒度控制)

如果需要针对特定端点或场景做编码控制,可以自定义MessageBodyReader强制使用UTF-8解码表单数据:

import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.MultivaluedMap;
import jakarta.ws.rs.ext.MessageBodyReader;
import jakarta.ws.rs.ext.Provider;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import org.apache.commons.io.IOUtils;

@Provider
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public class Utf8FormReader implements MessageBodyReader<MultivaluedMap<String, String>> {

    private final MessageBodyReader<MultivaluedMap<String, String>> delegate;

    // 注入容器默认的表单读取器
    public Utf8FormReader(MessageBodyReader<MultivaluedMap<String, String>> delegate) {
        this.delegate = delegate;
    }

    @Override
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return delegate.isReadable(type, genericType, annotations, mediaType);
    }

    @Override
    public MultivaluedMap<String, String> readFrom(Class<MultivaluedMap<String, String>> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException {
        // 强制以UTF-8读取请求体,再交给默认读取器解析
        String formData = IOUtils.toString(entityStream, StandardCharsets.UTF_8);
        InputStream utf8Stream = IOUtils.toInputStream(formData, StandardCharsets.UTF_8);
        return delegate.readFrom(type, genericType, annotations, mediaType, httpHeaders, utf8Stream);
    }
}

注意:需确保项目引入commons-io依赖,或自行实现流与字符串的转换逻辑。

方法3:显式指定Consumes charset(不推荐)

虽然可以在@Consumes中硬编码charset,但这会要求客户端必须使用指定编码,无法满足“未指定时默认UTF-8”的需求,因此不推荐:

@Consumes("application/x-www-form-urlencoded;charset=UTF-8")

内容的提问来源于stack exchange,提问作者cssdata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:22:11