Разница между spring @Controller и аннотацией @ RestController
разницу между весной @Controller
и @RestController
Примечание.
Can @Controller
аннотация будет использоваться для веб-приложений MVC и REST?
Если да, то как мы можем различать, является ли это веб-приложение MVC или REST.
12 ответов
-
@Controller
используется для обозначения классов как контроллер Spring MVC. -
@RestController
является аннотацией удобства, которая не делает ничего больше, чем добавление@Controller
и@ResponseBody
аннотации (см.: Javadoc)
таким образом, следующие два определения контроллера должны делать то же самое
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
в коде ниже я покажу вам разницу
между @controller
@Controller
public class restClassName{
@RequestMapping(value={"/uri"})
@ResponseBody
public ObjectResponse functionRestName(){
//...
return instance
}
}
и @RestController
@RestController
public class restClassName{
@RequestMapping(value={"/uri"})
public ObjectResponse functionRestName(){
//...
return instance
}
}
на @ResponseBody
активирован по умолчанию. Вам не нужно добавлять его над сигнатурой функции.
@RestController
аннотированные классы такие же, как @Controller
но @ResponseBody
на обработчике подразумеваются методы.
на самом деле, будьте осторожны - они не совсем одинаковые.
если вы определяете какие-либо перехватчики в своем приложении, они не будут применяться к контроллерам, аннотированным как @RestController
, однако они работают с @Controller
аннотированный контроллеры.
ie. конфигурация перехватчика:
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
}
}
и в объявлении регулятора весны:
@Controller
public class AdminServiceController {...
, но
@RestController
public class AdminServiceController {...
не имея перехватчик быть связанным с ним.
Как вы можете видеть в весенней документации ( Документация По Spring RestController) аннотация контроллера Rest совпадает с аннотацией контроллера, но при условии, что @ResponseBody активен по умолчанию, поэтому все json анализируются на объекты java.
Если вы используете @RestController, вы не можете вернуть представление (используя Viewresolver в Spring/springboot), и да @ResponseBody в этом случае не требуется.
Если вы используете @controller, вы можете вернуть представление в Spring webMVC.
новая аннотация @RestController в Spring4+, которая отмечает класс как контроллер, где каждый метод возвращает объект домена вместо представления. Это стенография для @Controller и @ResponseBody вместе взятых.
@RestController
был предоставлен с весны 4.0.1. эти контроллеры укажите, что здесь методы @RequestMapping принимают семантику @ResponseBody по умолчанию.
в более ранних версиях подобная функциональность может быть достигнута с помощью ниже:
@RequestMapping
в сочетании с@ResponseBody
как@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }
<mvc:annotation-driven/>
может использоваться как один из способов использования JSON с Jackson или xml.- MyBean можно определить как
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
-
@ResponseBody
рассматривается как представление здесь среди MVC, и он отправляется напрямую, а не отправляется с сервлета диспетчера, и соответствующие конвертеры преобразуют ответ в соответствующий формат, такой как text/html, application/xml, application/json .
однако Restcontroller уже связан с ResponseBody и соответствующими преобразователями. Во-вторых, здесь, так как вместо преобразование responsebody, он автоматически преобразуется в http-ответ.
-
@Controller
: эта аннотация является всего лишь специализированной версией@Component
и он позволяет классам контроллера автоматически обнаруживаться на основе сканирования пути к классам. -
@RestController
: эта аннотация является специализированной версией@Controller
добавляет@Controller
и@ResponseBody
аннотация автоматически, поэтому нам не нужно добавлять@ResponseBody
к нашим методам отображения.
класс помечен как @RestController
, Что означает, что он готов к использованию Spring MVC для обработки веб-запросов.@RequestMapping
карты / к index()
метод. При вызове из браузера или с помощью curl в командной строке метод возвращает чистый текст. Это потому что @RestController
совместная @Controller
и @ResponseBody
, две аннотации, которые приводят к веб-запросам, возвращающим данные, а не представление.
@RestController
составлен @Controller
и @ResponseBody
, если мы не используем @ResponseBody
в сигнатуре метода тогда нам нужно использовать @Restcontroller
.
вместо использования @Controller и @ResponseBody, @RestController давайте вы выставите REST API весной 4.0 и выше.