Предположим, что у меня есть веб-приложение Spring 4 с уровнем сохранения на основе Hibernate. Я хотел бы создать RestController
, который поддерживает основные операции CRUD для моих моделей. Создание метода для выборки записей работает без сучка и задоринки:Сопоставление моделей JSON с Hibernate в Spring контроллеров REST
@RequestMapping(value = "/stuff/list", method = RequestMethod.GET)
public List<Stuff> getStuff(){
return stuffService.findAll();
}
Джексон обрабатывает сериализации объектов, никаких проблем. Но что, если я хочу добавить метод для создания новых записей через запрос POST? Есть ли простой способ поддержки простого метода, подобного этому?
@RequestMapping(value = "/stuff/new", method = RequestMethod.POST)
public Integer getStuff(@RequestParam("stuff") Stuff stuff){
return stuffService.save(stuff);
}
Возможно ли это как можно? Или мне нужно вручную сопоставить данные формы в форме нового объекта?
РЕШЕНИЕ
Вот как я решил мою проблему, была пара шагов. Во-первых, мой последний метод контроллера:
@RequestMapping(value = "/stuff/new", method = RequestMethod.POST)
public Integer getStuff(@RequestBody Stuff stuff){
return stuffService.save(stuff);
}
Я уже фильтр применяется ко всем запросам к API приложений, чтобы обеспечить совместное использование перекрестного происхождения ресурсов, но были необходимы изменения в этом, чтобы запросы указать тип содержимого:
public class SimpleCORSFilter implements Filter{
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override public void init(FilterConfig filterConfig) throws ServletException { }
@Override public void destroy() { }
}
, который зарегистрирован в моем web.xml
файле:
<filter>
<filter-name>cors</filter-name>
<filter-class>com.company.app.util.SimpleCORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>
Теперь, когда я делаю запрос, например, один ниже, это будет правильно карта мой представленный JSON для моей модели и сохраняется новый экземпляр:
var stuff = {
name: "Some stuff",
description: "This is some stuff."
}
$.ajax({
url: url,
method: "post",
dataType: "json",
data: JSON.stringify(stuff),
contentType: "application/json"
}).done(function(data){
console.log(data);
}).fail(function(x, status, e){
console.log(e);
});
Является ли содержание html формой POST или JSON? – Affe
@Affe: JSON, отправленный либо через запрос AJAX браузера, либо через Spring 'RestTemplate'. – woemler