请求方法' GET'实施PUT

时间:2018-04-30 16:05:58

标签: spring angular mongodb rest http

好吧,这是我关于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
}

现在我的前端由古老的AngularJS制作,并在资源的自我链接上调用一些神奇的Spring Data Rest方法,如GET和PUT。但现在我在调用PUT后需要一些服务器端日志记录。所以我决定为PUT做一些自己的实现 - 但不是GET。 PUT工作正常,但不幸的是GET不再工作了。我总是得到&#34;请求方法&#39; GET&#39;不支持&#34;在我的日志中。

我的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(书籍资源的自我链接) - 我是否必须为一个URL实现所有HTTP方法或者没有?我错过了什么?

1 个答案:

答案 0 :(得分:0)

每个端点需要一个动词,因此您需要一个@RequestMapping(method = RequestMethod.GET)方法来处理GET请求。

在旁注中,Spring团队建议constructor injection over @Autowired

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