java - Spring RestTemplate Behavior when handling responses with a status of NO_CONTENT -


okay, have class namedsystems, has field set of namedsystem.

i have method find namedsystems criteria. that's not important. when gets results, works fine. however, when can't find anything, , returns null (or empty -- i've tried both ways) set, problems. let me explain.

i'm using spring resttemplate class , i'm making call in unit test:

responseentity<?> responseentity = template.exchange(base_service_url + "?   alias={aliasvalue}&aliasauthority={aliasassigningauthority}",    httpmethod.get, makehttpentity("xml"), namedsystems.class,    alias1.getalias(), alias1.getauthority()); 

now, since return 200, want return 204, have interceptor in service determines if modelandview namedsystem , if set null. if so, set status code no_content (204).

when run junit test, error:

org.springframework.web.client.restclientexception: cannot extract response: no content-type found 

setting status no_content seems wipe content-type field (which make sense when think it). why looking @ it?

spring's httpmessageconverterextractor extractdata method:

public t extractdata(clienthttpresponse response) throws ioexception {     mediatype contenttype = response.getheaders().getcontenttype();     if (contenttype == null) {         throw new restclientexception("cannot extract response: no content-type found");     }     (httpmessageconverter messageconverter : messageconverters) {         if (messageconverter.canread(responsetype, contenttype)) {             if (logger.isdebugenabled()) {                 logger.debug("reading [" + responsetype.getname() + "] \"" + contenttype                     +"\" using [" + messageconverter + "]");             }             return (t) messageconverter.read(this.responsetype, response);         }     }     throw new restclientexception(         "could not extract response: no suitable httpmessageconverter found response type [" +         this.responsetype.getname() + "] , content type [" + contenttype + "]"); } 

going chain bit find out extractor set, come resttemplate's exchange() method used in test:

public <t> responseentity<t> exchange(string url, httpmethod method,   httpentity<?> requestentity, class<t> responsetype, object... urivariables) throws restclientexception {     httpentityrequestcallback requestcallback = new httpentityrequestcallback(requestentity, responsetype);     responseentityresponseextractor<t> responseextractor = new responseentityresponseextractor<t>(responsetype);     return execute(url, method, requestcallback, responseextractor, urivariables); } 

so, it's trying convert amounts nothing because of supplied response type exchange call. if change responsetype namedsystems.class null, works expected. doesn't try convert anything. if had tried set status code 404, executes fine.

am misguided, or seem flaw in resttemplate? sure, i'm using junit right know what's going happen, if using resttemplate call , doesn't know outcome of service call, naturally have namedsystems response type. however, if tried criteria search came no elements, they'd have nasty error.

is there way around without overriding resttemplate stuff? viewing situation incorrectly? please i'm bit baffled.

i believe should @ responseextractor interface & call execute on resttemplate providing implementation of extractor. me looks common requirement have logged this:

https://jira.springsource.org/browse/spr-8016

here's 1 prepared earlier:

private class myresponseextractor extends httpmessageconverterextractor<myentity> {      public myresponseextractor (class<myentity> responsetype,       list<httpmessageconverter<?>> messageconverters) {         super(responsetype, messageconverters);     }      @override     public myentity extractdata(clienthttpresponse response) throws ioexception {          myentity result;          if (response.getstatuscode() == httpstatus.ok) {             result = super.extractdata(response);         } else {             result = null;         }          return result;     } } 

i've tested & seems want.

to create instance of responseextractor call constructor & pass converters resttemplate instance that's been injected;

e.g.

responseextractor<myentity> responseextractor =     new myresponseextractor(myentity.class, resttemplate.getmessageconverters()); 

then call is:

myentity responseasentity =     resttemplate.execute(urltocall, httpmethod.get, null, responseextractor); 

your mileage may vary. ;-)


Comments

Popular posts from this blog

c++ - How do I get a multi line tooltip in MFC -

asp.net - In javascript how to find the height and width -

c# - DataTable to EnumerableRowCollection -