2016-06-06 3 views
0

Я пытался написать пользовательскую функциональность, в которой конечная точка REST потребляет простой текст. Вот кусок кода:Spring Data Rest Custom Controller с содержимым-типом: «text/plain»

@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 some custom logic here 

     //sampleRepository.update(id); 
    } 

} 

остальное Spring Data бросает исключение HttpStatus.UNSUPPORTED_MEDIA_TYPE(415). Однако, когда я перемещаю код в отдельный контроллер:

@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 some custom logic here 

     //sampleRepository.update(id); 
    } 
} 

Это работает нормально. Кто-нибудь сталкивался с подобными проблемами, перемещение кода в отдельный метод разрешает проблему (Work Around).

Любое предложение о том, как подойти к проблеме было бы здорово

ответ

0

Единственное различие, которое я вижу между вашими двумя примерами кода является использование @RepositoryRestController в первом случае по сравнению с @RestController во втором случае ,

При переопределении конечной точки, которые автоматически генерируются Spring Data REST, такие как PUT/API/образцы/{ID}, вы должны использовать @RequestMapping на уровне метода, по причинам, подверженных here.

Официальная документация явно запрещает сопоставление запросов на уровне класса, но только example, данный ему, использует метод запроса на уровне метода.

@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 some custom logic here 

     //sampleRepository.update(id); 
    } 

} 

Если вы используете как @RepositoryRestController и @RequestMapping на уровне класса, вы потеряете доступ ко всем конечных обработчиков Spring Data Rest обычно создает. Я предполагаю, что вы отправляете запрос на /api/samples/{id} без указания типа содержимого на текст/plain, поэтому на самом деле нет конечной точки, которая может обрабатывать ваш запрос, следовательно, сообщение об ошибке.

Замечание относительно Seconde образца кода: @ResponseBody подразумевается @RestController, поэтому нет необходимости комментировать свой метод с ним.