i have been trying write custom functionality rest end point consumes plain-text . here piece of code:
@repositoryrestcontroller @requestmapping("/api/samples") public class samplecontroller { @autowired samplerepository samplerepository; @requestmapping(value = "/{id}", method = requestmethod.put, consumes = mediatype.text_plain_value) @responsebody public void updatesample(@pathvariable long id, @requestbody string message ) { //do custom logic here //samplerepository.update(id); } }
spring data rest throws exception httpstatus.unsupported_media_type(415)
. when move code separate controller:
@restcontroller @requestmapping("/api/samples") public class samplecontroller { @autowired samplerepository samplerepository; @requestmapping(value = "/{id}", method = requestmethod.put,consumes =mediatype.text_plain_value) @responsebody public void updatesample(@pathvariable long id,@requestbody string message ) { //do custom logic here //samplerepository.update(id); } }
this works fine . has faced similar issues, moving code separate method resolves issue(work around).
any suggestion on how approach problem great
the difference see between 2 code samples use of @repositoryrestcontroller in first case versus @restcontroller in second case.
when overriding endpoint auto-generated spring data rest, such put /api/samples/{id}, should use @requestmapping @ method level, reasons exposed here.
the official documentation not explicitly forbidding class-level requestmapping, example given uses method-level requestmapping.
@repositoryrestcontroller public class samplecontroller { @autowired samplerepository samplerepository; @requestmapping(value = "/api/samples/{id}", method = requestmethod.put, consumes = mediatype.text_plain_value) @responsebody public void updatesample(@pathvariable long id, @requestbody string message ) { //do custom logic here //samplerepository.update(id); } }
if use both @repositoryrestcontroller , @requestmapping @ class level, lose access endpoint handlers spring data rest generates. guess you're sending request /api/samples/{id} without setting content type text/plain, there no endpoint can handle request, hence error message.
a remark regarding seconde code sample: @responsebody implied @restcontroller, there no need annotate method it.