2016-11-08 9 views
1

Я написал пользовательский RepositoryRestController с использованием соответствующего репозитория объекта. При выполнении запроса на этом URL-адресе запрос выполняется в моей консоли, но url возвращает 404. Я также могу видеть requestHandlerMapping для этого URL-адреса в журналах. См. Мой следующий фрагмент кода.Пользовательский репозиторийRestController Сопоставление URL-адресов 404 в резервном режиме данных

Repository:

@RepositoryRestResource 
    public interface FooRepository extends BaseRepository<Foo, Integer> { 
    @RestResource(exported = false) 
    List<Foo> findByName(String name); 
    } 

Контроллер:

@RepositoryRestController 
public class FooResource { 
@Aurowired 
FooRepository fooRepository; 

@Autowired 
RestApiService restApiService; 

@RequestMapping(value = "/foos/search/byApiName", method = GET) 
public ResponseEntity<?> findByApiName(String name) { 
List<String> apiNames = restApiService.getNameLike(name); 
List<Foo> fooList = fooRepository.findByName(name); 

List<String> fooNames = // list of names from fooList 
... 
System.out.println("FETCHING apiNames"); 
return apiNames; 
} 

Когда я выполнить следующие действия локонов команду

curl -X GET http:localhost:8080/foos/search/byApiName 

ответ возвращает ошибку 404. Я не знаю почему. Но он распечатывает заявление на печать в консоли.

@hat Я делаю неправильно здесь?

+0

Условная ошибка 404 в Spring означает, что вам не хватает корня контекста. И вы звоните в службу без нее. Попробуйте добавить его после номера порта и перед '/ foos'. Обычно это название проекта. Например, http: // localhost: 8080/SpringWeb/foos/search/byApiName' – amicoderozer

ответ

5

Я бы предположил, что вам нужно добавить @ResponseBody к вашему методу или к возвращаемому значению (как в примере SDR http://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.overriding-sdr-response-handlers) или обернуть свой список в ResponseEntity.

Не уверен, что если есть какие-либо различия между этими подходами, но все должны, как указано в документации Spring MVC:

«указывают, что тип возвращаемого значения должны быть записаны прямо в тело ответа HTTP (и не помещается в модель, или [будет] интерпретирована как вид ). "

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

При отладке оператор печатает, но вы получите 404, казалось бы, последнее действие, что происходит.

@RequestMapping(value = "/foos/search/byApiName", method = GET) 
@ResponseBody 
public ResponseEntity<?> findByApiName(String name) { 
    // .... 
} 

или

@RequestMapping(value = "/foos/search/byApiName", method = GET) 
public @ResponseBody ResponseEntity<?> findByApiName(String name) { 
    //.... 
} 

или

@RequestMapping(value = "/foos/search/byApiName", method = GET) 
public ResponseEntity<List<String>> findByApiName(String name) { 
    //.... 

    return new ResponseEntity<List<String>>(fooNames, HttpStatus.OK); 
} 
3

я узнал, что контроллер необходимо аннотацию @RequestMapping, в противном случае он будет проигнорирован. Ниже мой код:

@RepositoryRestController 
@RequestMapping("/security") 
public class ... 

Это работает для меня.

+0

Мне нужен был как ответ, чтобы заставить его работать – Mikyjpeg

 Смежные вопросы

  • Нет связанных вопросов^_^