Метод запроса «GET» не поддерживается после реализации PUT - PullRequest
0 голосов
/ 30 апреля 2018

хорошо, это мой первый вопрос о Stackoverflow, поэтому я надеюсь, что я достаточно хорошо объясняю свою проблему: -)

Я работаю с Spring Data Rest MongoDB. Я использую некоторые «магические» методы, которые доступны только при реализации MongoRepository, но я также использую пользовательские реализации и RestController. Итак, позвольте мне показать вам код:

Мой репозиторий выглядит так:

public interface BookRepository extends MongoRepository<Book, String>{
   //here are some methods that don't play a role here
}

Теперь мой Frontend сделан из старого доброго AngularJS и вызывает некоторые из магических методов Spring Data Rest, таких как GET и PUT, для собственной ссылки на ресурс. Но теперь мне нужно вести журнал на стороне сервера после вызова PUT. Поэтому я решил сделать собственную реализацию для PUT - но не для GET. PUT работает нормально, но, к сожалению, GET больше не работает. Я всегда получаю «Запрос метода« GET »не поддерживается» в моих журналах.

Мой RestController теперь выглядит так:

@RepositoryRestController
@RequestMapping("/book/{mongoId}")
public class BookRestController {

    @Autowired
    private ResourceProcessor<Resource<Book>> bookResourceProcessor;

    @Autowired
    private BookRepository bookRepository;

    private static Logger LOG = 
        Logger.getLogger(BookRestController.class);


    @RequestMapping(method = RequestMethod.PUT,
        consumes = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    ResponseEntity<Resource<Book>> updateBookAndLog(
        @RequestBody Book book,
        @PathVariable(value = "mongoId") String mongoId,
        @RequestHeader("MyApp-User") String userId,
        @RequestHeader("MyApp-Action") String action) {

        Book bookBeforeUpdate = bookRepository.findOne(mongoId);
        LOG.info("Log something");

        book.setMongoId(mongoId);
        Book responseBook = bookRepository.save(book);

        return ResponseEntity.ok(bookResourceProcessor.process(new 
           Resource<book>(responseBook)));
    }
}

Вот пример GET и PUT из моего интерфейса:

myApp.factory('Book', function($http, $q, ConfigurationHelper) {

    return {
       getById: function (bookId) {
          return $http.get('book/' + bookId);
       },

       save: function(book, userId, action) {
            return $http.put(book._links.self.href, book,
                {headers: {"MyApp-User": userId,
                        "MyApp-Action" : action}
                });
        }
    }

Итак, теперь мой вопрос (ы): это потому, что PUT и POST используют один и тот же URL-адрес (собственную ссылку на ресурсы книги) - нужно ли мне реализовывать все методы HTTP для одного URL-адреса или ни одного? Есть ли что-то, что я пропустил?

1 Ответ

0 голосов
/ 01 мая 2018

Вам нужен глагол для конечной точки, поэтому вам потребуется метод @RequestMapping (method = RequestMethod.GET) для обработки запроса GET.

С другой стороны, команда Spring рекомендует инжекция в конструктор @Autowired:

public BookRestController(ResourceProcessor<Resource<Book>> bookResourceProcessor, BookRepository bookRepository) {
  this.bookResourceProcessor = bookResourceProcessor;
  this.bookRepository = bookRepository;
}
...