2017-04-10 1 views
0

J'utilise CXF ClientBuilder pour envoyer des données POST à ​​un service REST. La réponse que je me regarde en arrière comme ce moment:Utilisation de CXF ClientBUilder, comment démonter les paramètres de réponse post-traitement en classe Java

errorCode=206&errorMessage=blah+blah 

Je veux désorganiser ce dans les champs dans un POJO.

Le bloc de code suivant illustre ce que j'ai en ce moment:

public void validateToken(String token) { 
    WebTarget target = client.target(getHostPort()).path(getPath()); 
    Builder request = target.request(MediaType.APPLICATION_JSON_TYPE); 
    Form form = new Form(); 
    form.param("TokenID", token); 
    Response postResponse = request.post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE)); 
    System.out.println("postResponse[" + postResponse + "]"); 
    System.out.println("response.text[" + postResponse.readEntity(String.class) + "]"); 
//  CodeAndMessage codeAndMessage = request.post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE), CodeAndMessage.class); 
//  System.out.println("codeAndMessage[" + codeAndMessage + "]"); 
} 

public static class CodeAndMessage { 
    private String errorCode; 
    private String errorMessage; 

    public String getErrorCode() { return errorCode; } 
    public String getErrorMessage() { return errorMessage; } 

    public void setErrorCode(String errorCode) { this.errorCode = errorCode; } 
    public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } 

    @Override 
    public String toString() { 
     return new ToStringBuilder(this). 
       append("errorCode", getErrorCode()). 
       append("errorMessage", getErrorMessage()). 
       build(); 
    } 
} 

Comme écrit en ce moment, je reçois la réponse que je décrit à l'origine. J'essaye de comprendre une variation de ces dernières lignes commentées pour remplacer la première "request.post()" et les deux lignes suivantes, pour obtenir le résultat que je recherche.

Mise à jour:

J'ai trouvé au moins un moyen de le faire, mais je ne sais pas si c'est la meilleure façon.

Form responseForm = request.post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE), Form.class); 
    System.out.println("responseForm[" + responseForm + "] map[" + responseForm.asMap() + "]"); 
    return new CodeAndMessage(). 
       errorCode(responseForm.asMap().getFirst("errorCode")). 
       errorMessage(responseForm.asMap().getFirst("errorMessage")); 

La clé utilisait l'objet Form pour le type de réponse. Avec cette solution, je dois encore référencer les noms de champs. Y a-t-il une façon plus propre de faire cela?

Mise à jour:

Je suppose qu'une solution plus propre, il faudrait mettre en place un MessageBodyReader pour cette classe CodeAndMessage, mais je ne sais pas encore comment faire.

Répondre

0

Ma mise en œuvre de MessageBodyReader ressemble à ceci:

import java.io.IOException; 
import java.io.InputStream; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.Type; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.core.Form; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.MultivaluedMap; 
import javax.ws.rs.ext.MessageBodyReader; 
import javax.ws.rs.ext.Provider; 

import org.apache.cxf.jaxrs.provider.FormEncodingProvider; 

@Provider 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public class StuffResponseReader implements MessageBodyReader<StuffResponse> { 

    private FormEncodingProvider<Form> formProvider = new FormEncodingProvider<>(); 

    private static final String PROP_ERROR_CODE     = "errorCode"; 
    private static final String PROP_ERROR_DESCRIPTION   = "errorMessage"; 
    ... 

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

    @Override 
    public StuffResponse readFrom(Class<StuffResponse> type, Type genericType, Annotation[] annotations, 
      MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) 
      throws IOException, WebApplicationException { 
     Form form = formProvider.readFrom(Form.class, Form.class, annotations, mediaType, httpHeaders, entityStream); 
     MultivaluedMap<String, String> data = form.asMap(); 
     return new StuffResponse(). 
       errorCode(data.getFirst(PROP_ERROR_CODE)). 
       errorDescription(data.getFirst(PROP_ERROR_DESCRIPTION)). 
       ...; 
    } 
} 

Lors de la création du ClientBuilder, j'enregistrer le MBR comme ceci:

ClientBuilder builder = ClientBuilder.newBuilder().register(StuffResponseReader.class);