読者です 読者をやめる 読者になる 読者になる

メモ:JAX-RS(RESTEasy) の Multipart の Charset 指定方法

ここで紹介されています。
Java - JBossのRESTEasyにおけるMultipart Requestの文字化け対策 - Qiita

ですが、PreProcessInterceptor は @Deprecated になっていました。
しかも @Provider 付けると Eclipse でこんな感じのエラーが。

The Provider must implement at least one of the following interfaces: javax.ws.rs.ext.MessageBodyReader, javax.ws.rs.ext.MessageBodyWriter, javax.ws.rs.ext.ExceptionMapper, javax.ws.rs.ext.ReaderInterceptor, javax.ws.rs.ext.WriterInterceptor, javax.ws.rs.container.ContainerRequestFilter, javax.ws.rs.container.ContainerResponseFilter or javax.ws.rs.ext.ContextResolver.

このままビルドしてデプロイしたら意図した通りには動くんですが嫌ですよね。
ちなみに最新のドキュメント 3.0.9 でも PreProcessInterceptor のままです。
Chapter 23. Multipart Providers

というわけで代替手段を探します。
RESTEasy のドキュメントには Filter と Interceptor について書いてる箇所があります。
Chapter 33. Filters and Interceptors
ここで紹介されている ContainerRequestFilter を使って代替してみます。

import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;

@Provider
@SuppressWarnings("all")
public class ContentTypeSetterContainerRequestFilter implements ContainerRequestFilter {
  public void filter(final ContainerRequestContext context) throws IOException {
    context.setProperty(InputPart.DEFAULT_CHARSET_PROPERTY, "UTF-8");
  }
}

こんな感じですかね。
PreProcessInterceptor が廃止になったのは、JAX-RS 自体に Filter/Interceptor が入ったからかな?