java - Spring Data Rest Custom Controller With with content-Type:"text/plain" -


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.