Spring Red RESTful контроллер не работает при перенаправлении - PullRequest
0 голосов
/ 01 июля 2010

Я устанавливаю простой контроллер RESTful для ресурса Todo с представлением XML.Все отлично работает - пока я не попытаюсь перенаправить.Например, когда я POST новый Todo и пытаюсь перенаправить на его новый URL (например, /todos/5, я получаю следующую ошибку:

Error 500 Unable to locate object to be marshalled in model: {}

Я знаю, что POST работал, потому чтоЯ могу вручную перейти на новый URL (/todos/5) и увидеть только что созданный ресурс. Это только при попытке перенаправить, что я получаю сбой. Я знаю, что в моем примере я мог просто вернуть только что созданный объект Todo, но у меня естьдругие случаи, когда перенаправление имеет смысл. Ошибка выглядит как проблема с маршалингом, но, как я уже сказал, она возникает, когда я добавляю перенаправления в мои методы RESTful, и не возникает, если вручную нажимать на URL, на который я перенаправляю.

Фрагмент кода:

@Controller
@RequestMapping("/todos")
public class TodoController {

    @RequestMapping(value="/{id}", method=GET)
    public Todo getTodo(@PathVariable long id) {
        return todoRepository.findById(id);
    }

    @RequestMapping(method=POST)
    public String newTodo(@RequestBody Todo todo) {
        todoRepository.save(todo); // generates and sets the ID on the todo object
        return "redirect:/todos/" + todo.getId();
    }

    ... more methods ...

    public void setTodoRepository(TodoRepository todoRepository) {
        this.todoRepository = todoRepository;
    }

    private TodoRepository todoRepository;
}

Можете ли вы определить, что мне не хватает? Я подозреваю, что это может быть связано с возвратом строки перенаправления - возможно, вместо того, чтобы вызвать ее перенаправлениефактически передается в представление XML-маршалинга, используемое моим распознавателем представлений (не показано - но типично для всех онлайн-примеров), и JAXB (настроенныйИнструмент ОХМ) не знает, что с ним делать.Просто предположение ...

Заранее спасибо.

1 Ответ

2 голосов
/ 01 июля 2010

Это произошло потому, что префикс redirect: обрабатывается InternalResourceViewResolver (фактически UrlBasedViewResolver). Поэтому, если у вас нет InternalResourceViewResolver или ваш запрос не попадает в него во время процесса разрешения представления, перенаправление не обрабатывается.

Чтобы решить эту проблему, вы можете либо вернуть RedirectView из вашего метода контроллера, либо добавить собственный преобразователь представления для обработки перенаправлений:

public class RedirectViewResolver implements ViewResolver, Ordered {
    private int order = Integer.MIN_VALUE;

    public View resolveViewName(String viewName, Locale arg1) throws Exception {
        if (viewName.startsWith(UrlBasedViewResolver.REDIRECT_URL_PREFIX)) {
            String redirectUrl = viewName.substring(UrlBasedViewResolver.REDIRECT_URL_PREFIX.length());
            return new RedirectView(redirectUrl, true);
        }
        return null;
    }

    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }
}
...