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

