2016-11-24 3 views
1

私は、パラメータ名と値を含むマップをGET Webターゲットに渡す方法を探しています。私はRESTEasyが自分のマップをURLクエリのパラメータリストに変換することを期待しています。しかし、RESTEasyは例外としてCaused by: javax.ws.rs.ProcessingException: RESTEASY004565: A GET request cannot have a body. をスローします。 RESTEasyにこのマップをURLクエリパラメータに変換するように指示するにはどうすればよいですか?これは、使用されRESTEasyプロキシクライアントを使用してクエリparamsマップを送信する方法

@Path("/") 
@Consumes(MediaType.APPLICATION_JSON) 
public interface ExampleClient { 

    @GET 
    @Path("/example/{name}") 
    @Produces(MediaType.APPLICATION_JSON) 
    Object getObject(@PathParam("name") String name, MultivaluedMap<String, String> multiValueMap); 

} 

この

がプロキシインタフェースであるRESTEasyのソースコードに掘り下げ時間後

@Controller 
public class ExampleController { 

    @Inject 
    ExampleClient exampleClient; // injected correctly by spring DI 

    // this runs inside a spring controller 
    public String action(String objectName) { 
     MultivaluedMap<String, String> params = new MultivaluedHashMap<>(); 

     // in the real code I get the params and values from a DB 
     params.add("foo", "bar") 
     params.add("jar", "car") 
     //.. keep adding 

     exampleClient.getObject(objectName, params); // throws exception 
    } 

} 

答えて

1

、しかし私はそれを行う方法がないことが判明しましたインタフェース注釈。要するに、RESTEasyは、org.jboss.resteasy.client.jaxrs.internal.proxy.processors.ProcessorFactoryから「プロセッサ」と呼ばれるものを作成して、注釈をターゲットURIにマッピングします。

しかし、この問題を解決するには、(もちろんリクエストを実行する前に)リクエスト本体からマップを取得し、URIクエリのparamの中に配置するClientRequestFilterを作成することは本当に簡単です。以下のコードをチェックしてください:

フィルタ:

@Provider 
@Component // because I'm using spring boot 
public class GetMessageBodyFilter implements ClientRequestFilter { 
    @Override 
    public void filter(ClientRequestContext requestContext) throws IOException { 
     if (requestContext.getEntity() instanceof Map && requestContext.getMethod().equals(HttpMethod.GET)) { 
      UriBuilder uriBuilder = UriBuilder.fromUri(requestContext.getUri()); 
      Map allParam = (Map)requestContext.getEntity(); 
      for (Object key : allParam.keySet()) { 
       uriBuilder.queryParam(key.toString(), allParam.get(key)); 
      } 
      requestContext.setUri(uriBuilder.build()); 
      requestContext.setEntity(null); 
     } 
    } 
} 

PS:私はシンプル

ため Mapの代わり MultivaluedMapを使用していました
関連する問題