Разница между 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 по умолчанию.

в более ранних версиях подобная функциональность может быть достигнута с помощью ниже:

  1. @RequestMapping в сочетании с @ResponseBody как @RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. <mvc:annotation-driven/> может использоваться как один из способов использования JSON с Jackson или xml.

  3. MyBean можно определить как

@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }

  1. @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 и выше.