好吧,这是我关于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方法或者没有?我错过了什么?
答案 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;
}