Spring 请求方法';获取';实现PUT后不支持
好的,这是我关于Stackoverflow的第一个问题,所以我希望,我已经很好地解释了我的问题:-) 我正在使用Spring数据Rest MongoDB。我正在使用一些“神奇”的方法,这些方法仅通过实现MongoRepository就可以使用,但我也在使用自定义实现和RestController。让我向您展示一些代码: 我的存储库如下所示:Spring 请求方法';获取';实现PUT后不支持,spring,angular,mongodb,rest,http,Spring,Angular,Mongodb,Rest,Http,好的,这是我关于Stackoverflow的第一个问题,所以我希望,我已经很好地解释了我的问题:-) 我正在使用Spring数据Rest MongoDB。我正在使用一些“神奇”的方法,这些方法仅通过实现MongoRepository就可以使用,但我也在使用自定义实现和RestController。让我向您展示一些代码: 我的存储库如下所示: public interface BookRepository extends MongoRepository<Book, String>{
public interface BookRepository extends MongoRepository<Book, String>{
//here are some methods that don't play a role here
}
现在我的问题是:是因为PUT和POST使用相同的URL(图书资源的自链接)——我必须为一个URL实现所有HTTP方法还是不实现?我错过了什么吗 每个端点都需要一个谓词,因此需要@RequestMapping(method=RequestMethod.GET)方法来处理GET请求 另一方面,Spring团队建议: 公共BookRestController(ResourceProcessor bookResourceProcessor,BookRepository BookRepository){ this.bookResourceProcessor=bookResourceProcessor; this.bookRepository=bookRepository; }
谢谢你的回答,只是想确保我们彼此理解正确:在我实现示例中的PUT方法之前,由于RepositoryRestResource注释,PUT和GET工作(我在示例中忘记了这一点,我将添加它)。我只是想知道为什么现在在实现PUT时GET不工作。所以你说的意思是,我必须在实现其中一个动词后立即实现这两个动词?没问题,你的BookRestController没有GET handle。实际上,如果你不指定RequestMapping,同一个方法可以处理所有动词。当您专门添加PUT时,它不再是默认值,因此您还需要指定GET以允许GET请求。我知道没有GET处理程序。我想覆盖PUT,但仍然有其他HTTP方法(如SpringDataREST)自动公开它们。也许写了以下问题的人解释得更好:
@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)));
}
}
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}
});
}
}
public BookRestController(ResourceProcessor<Resource<Book>> bookResourceProcessor, BookRepository bookRepository) {
this.bookResourceProcessor = bookResourceProcessor;
this.bookRepository = bookRepository;
}