java - Custom HttpMessageConverter in Spring MVC -
when implementing restful api wrap data in object looks this.
{error: null, code: 200, data: {...actual data...}}
this results in repetitive code use everywhere wrap data:
@transactional @requestmapping(value = "/", method = requestmethod.get) public @responsebody result<list<bookshortdto>> books() { list<book> books = booksdao.readbooks(); return result.ok(books); // gets repeated everywhere }
so question how modify (maybe use of custom httpmessageconverter maybe other ways?) return booksdao.readbooks() , wrapped automatically.
like @ralph suggested can use handlermethodreturnvaluehandler
wrap handlers return value.
the easiest way achieve extending requestresponsebodymethodprocessor
, alter it's behavior bit. best create custom annotation mark handler methods with. make sure handlermethodreturnvaluehandler
called instead of others included requestmappinghandleradapter
default.
@target({elementtype.method}) @retention(retentionpolicy.runtime) public @interface resultresponsebody {}
here simple implementation of custom handlermethodreturnvaluehandler
named resultresponsehandlermethodprocessor
support values returned methods annotated resultresponsebody
. it's pretty simple. override supportsreturntype()
, handlereturnvalue()
methods suit needs (wrap return value result
type).
public class resultresponsehandlermethodprocessor extends requestresponsebodymethodprocessor { public resultresponsehandlermethodprocessor(final list<httpmessageconverter<?>> messageconverters) { super(messageconverters); } public resultresponsehandlermethodprocessor(final list<httpmessageconverter<?>> messageconverters, final contentnegotiationmanager contentnegotiationmanager) { super(messageconverters, contentnegotiationmanager); } @override public boolean supportsreturntype(final methodparameter returntype) { return returntype.getmethodannotation(resultresponsebody.class) != null; } @override public void handlereturnvalue(final object returnvalue, final methodparameter returntype, final modelandviewcontainer mavcontainer, final nativewebrequest webrequest) throws ioexception, httpmediatypenotacceptableexception { super.handlereturnvalue(result.ok(returnvalue), returntype, mavcontainer, webrequest); } }
the thing left add class list of custom handlermethodreturnvaluehandler
s , provide mappingjackson2httpmessageconverter
instance.
@enablewebmvc @configuration public class applicationconfiguration extends webmvcconfigureradapter @override public void addreturnvaluehandlers(final list<handlermethodreturnvaluehandler> returnvaluehandlers) { list<httpmessageconverter<?>> messageconverters = new arraylist<>(); messageconverters.add(new mappingjackson2httpmessageconverter()); returnvaluehandlers.add(new resultresponsehandlermethodprocessor(messageconverters)); } }
Comments
Post a Comment