簡體   English   中英

使用CXF ClientBUilder,如何將后響應參數編組為Java類

[英]Using CXF ClientBUilder, how to unmarshal post response parameters into Java class

我正在使用CXF ClientBuilder將POST數據發送到REST服務。 我得到的回復現在看起來像這樣:

errorCode=206&errorMessage=blah+blah

我想將其解組到POJO的字段中。

以下代碼塊說明了我現在所擁有的:

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();
    }
}

就像現在寫的那樣,我得到了我最初描述的答復。 我試圖找出這些最后注釋掉的行的某種形式,以替換第一個“ request.post()”和后面的兩行,以得到我想要的結果。

更新

我確實找到了至少一種方法來執行此操作,但是我不知道這是否是最佳方法。

    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"));

關鍵是使用Form對象作為響應類型。 使用此解決方案,我仍然必須引用字段名稱。 有沒有更清潔的方法可以做到這一點?

更新

我猜想更干凈的解決方案將需要為此CodeAndMessage類實現MessageBodyReader,但是我不確定如何做到這一點。

我的MessageBodyReader實現如下所示:

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)).
                ...;
    }
}

創建ClientBuilder時,我會這樣注冊MBR:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM