簡體   English   中英

Jersey客戶端不返回或讀取多個類對象的響應

[英]Jersey client does not return or read response from multiple class objects

我的Web服務從多個實體返回響應。 但是當我通過使用response.readEntity(A.class)閱讀響應時。 注意類A包含類B和類C的依賴項。當我從上述語句讀取響應時,我只能讀取類A的內容。

在郵遞員那里,一切都很好。 郵遞員顯示包含A,B,C類內容的響應。 但是在球衣客戶中,我沒有獲得B類和C類內容。

您能幫我解決這個問題嗎?

以下是我的Java Pojo代碼

@XmlRootElement(name = "TA_TESTPATTERN")
@XmlAccessorType(XmlAccessType.FIELD)
public class TAPattern {
    private User User;
    private String TP_Type;
    private String Car;
    private String Category;
    private String Description;
    private TestCase TestCase;
    private String status;
    private String Customizable_Field;
    private RESULT_COLLECTION RESULT_COLLECTION;
    private String Id;
    private String xmlns;
    private String Variant;
    private String Code;

這里RESULT_COLLECTION是另一個類B ,而RESULT_COLLECTON再次包含類RESULT的對象數組的依賴項。 意味着RESULT_COLLECTION包含RESULT類數組。 因此,在我的情況下,類TAPatternA ,類RESULT_COLLECTIONB ,類RESULTC 測試用例說D

以下是我的球衣客戶代碼:

Response response = invocationBuilder.header("Content-Type", "application/xml")
        .post(Entity.entity(vstpattern, MediaType.APPLICATION_XML));
return response.readEntity(TAPattern.class);

以下是RESULT_COLLECTIONRESULT和測試用例的POJO類:

@XmlRootElement(name = "RESULT_COLLECTION")
@XmlAccessorType(XmlAccessType.FIELD)
public class RESULT_COLLECTION {
    private Result[] Result;
}

@XmlRootElement(name = "Result")
@XmlAccessorType(XmlAccessType.FIELD)
public class Result {
    private String Method;
    private String Href;
    private String Rel;
}

@XmlRootElement(name = "TestCase")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestCase {
    private String Method;
    private String Href;
    private String Rel;
}

以下是我的球衣客戶代碼:

ConfigPropertyHandler configPropertyHandler = ConfigPropertyHandler.getInstance();
        ClientConfig config = new ClientConfig();
        HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic(configPropertyHandler.getTid(),
                configPropertyHandler.getPassword());
        Client client = ClientBuilder.newClient(config);
        client.register(feature);

        WebTarget webTarget = client.target(configPropertyHandler.getVstUrl()).path(configPropertyHandler.getVstPath());
        Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_XML);

        Response response = invocationBuilder.header("Content-Type", "application/xml")
                .post(Entity.entity(vstpattern, MediaType.APPLICATION_XML));
        //return 0;


        return response.readEntity(TAPattern.class);

    }

以下是xml POSTMAN請求:

 <TA_TESTPATTERN xmlns="http://examples.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <Car>MyCar</Car>
        <Id>122</Id>
        <Code>myCode</Code>
        <Description> TA TEST</Description>
        <TP_Type>VF</TP_Type>
        <Category>0</Category>
        <Variant>0</Variant>
        <Customizable_Field> nda </Customizable_Field>
        <status>w</status>
        <RESULT_COLLECTION>
            <Result>
                <Href>http://examples.com</Href>
                <Method>GET</Method>
                <Rel>READ</Rel>
            </Result>
            <Result>
                <Href>http://examples.com</Href>
                <Method>GET</Method>
                <Rel>READ</Rel>
            </Result>
        </RESULT_COLLECTION>
        <TestCase>
            <Href>http://examples.com</Href>
            <Method>GET</Method>
            <Rel>READ</Rel>
        </TestCase>
        <User>
            <ID>f10711a</ID>
            <email>abc@external.com</email>
            <Name>abc</Name>
        </User>
    </TA_TESTPATTERN>

以下是我的TA_Pattern

@XmlRootElement(name = "TA_TESTPATTERN")
@XmlAccessorType(XmlAccessType.FIELD)
public class TAPattern {


    @XmlElement(name = "User")
    private User User;

    @XmlElement(name = "TP_Type")
    private String TP_Type;

    @XmlElement(name = "Car")
    private String Car;

    @XmlElement(name = "Category")
    private String Category;

    @XmlElement(name = "Description")
    private String Description;

    @XmlElement(name = "TestCase")
    private TestCase TestCase;

    @XmlElement(name = "status")
    private String status;

    @XmlElement(name = "Customizable_Field")
    private String Customizable_Field;

    @XmlElement(name = "RESULT_COLLECTION") RESULT_COLLECTION RESULT_COLLECTION;

    @XmlElement(name = "Id")
    private String Id;

    @XmlElement(name = "xmlns")
    private String xmlns;

    @XmlElement(name = "Variant")
    private String Variant;

    @XmlElement(name = "Code")
    private String Code;

以下是VSTTAPattern的POJO

@XmlRootElement(name = "TA_TESTPATTERN")
@XmlAccessorType(XmlAccessType.FIELD)
public class VSTTAPattern {


        private User User;

        private String TP_Type;

        private String Car;

        private String Category;

        private String Description;

        private TestCase TestCase;

        private String status;

        private String Customizable_Field;

        private RESULT_COLLECTION RESULT_COLLECTION;

        private String Id;

        private String xmlns;

        private String Variant;

        private String Code;

我強烈建議通過完全刪除RESULT_COLLECTION並將Result對象的列表添加到TAPattern類來更改您的設計。

class TAPattern{

...
@XmlElement
private List<Result> resultList;
}

public List<Result> getResultList(){
if(resultList==null)
    resultList = new ArrayList<Result>();

 return resultList;
}

@XmlAccessorType(XmlAccessType.FIELD) 
class Result {
....
}

這將使設計更加整潔。 就是說,我不確定您如何在服務器上生成xml響應,也許還有一些我不知道的約束。

更新:下面的代碼為我工作。

ClientConfig config = new ClientConfig();

        Client client = ClientBuilder.newClient(config);

        WebTarget target = client.target(UriBuilder.fromUri("http://localhost:8088/JerseyRest").build());   

        User u = new User();
        u.email = "xx@xx.com";
        u.ID = "sjdgzuauoj";
        u.Name = "user name";
        TestCase tc = new TestCase();
        tc.Href = "yyyy@hreg.com";
        tc.Method = "POST";
        tc.Rel = "link@link.com";

        Result[] rArr = new Result[]{ new Result(), new Result()};
        rArr[0].Href = "href@href.com";
        rArr[0].Method = "GET";
        rArr[0].Rel = "READ";

        rArr[1].Href = "href@href1.com";
        rArr[1].Method = "POST";
        rArr[1].Rel = "WRITE";
        RESULT_COLLECTION rCol = new RESULT_COLLECTION();

        rCol.Result = rArr;
        TAPattern req = new TAPattern();
        req.RESULT_COLLECTION = rCol;
        req.Car = "Volvo";
        req.Category = "0";
        req.Code = "1";
        req.Customizable_Field = "0";
        req.Description = "Test";
        req.status = "Y";
        req.Variant = "0";
        req.TestCase = tc;
        req.User = u;
        //GenericType<List<TAPattern>> taList = new GenericType<List<TAPattern>>() {};
        try{

        // Get XML for application   
       Response res = target.path("rest").path("UserService").path("xxxr").request()
                .accept(MediaType.APPLICATION_XML).post(Entity.entity(req, MediaType.APPLICATION_XML),Response.class);

        TAPattern ta = (TAPattern)res.readEntity(TAPattern.class);
       for(Result r : ta.RESULT_COLLECTION.Result ){
           System.out.println("Href: "+r.Href);
           System.out.println("Rel: "+r.Rel);
           System.out.println("Mehod: "+r.Method);
       }

    }catch(Exception e){
        System.out.println(e);
        return;
    }

您可能沒有正確填充TAPattern對象,結果並沒有收回一切。

暫無
暫無

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

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