Spring @Controller ve @RestController ek açıklamaları arasındaki fark


357

Bahar @Controllerve @RestControllerek açıklama arasındaki fark .

Can @Controllerhem Web MVC ve DİNLENME uygulamaları için kullanılabilir ANNOTATION?
Evet ise, Web MVC veya REST uygulaması olup olmadığını nasıl ayırt edebiliriz.

Yanıtlar:


471
  • @Controller sınıfları Spring MVC Controller olarak işaretlemek için kullanılır.
  • @RestController@Controllerve @ResponseBodyek açıklamaları eklemekten başka bir şey yapmayan kolaylık ek açıklamasıdır (bkz: Javadoc )

Bu yüzden aşağıdaki iki denetleyici tanımı aynı şeyi yapmalıdır

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


48
@RestController ayrıca yanıtı otomatik olarak JSON / XML dönüştürür düşünüyorum.
arnabkaycee


9
Ayrıca şablon motorunu kullanırsanız , bu ek açıklamada yer aldığından dolayı Thymeleafçalışmaz . @RestController@ResponseBody
Sonique

3
@ResponseBodydöndürülen nesneleri vücutta olabilecek bir şeye dönüştürür, örneğin JSON veya XML ( kaynak )
Martin Thoma

59

Aşağıdaki kodda size arasındaki farkı göstereceğim @controller

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

ve @RestController

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

@ResponseBodyVarsayılan olarak devreye girer. İşlev imzasının üstüne eklemenize gerek yoktur.


1
Java'daki sınıf adları büyük harfle başlamalıdır, yani RestClassName (restClassName değil).
Razzle

24

Eğer kullanırsanız @RestControllersize (kullanarak bir görünüm döndüremez Viewresolverevet Spring / springboot cinsinden) ve @ResponseBodybu durumda gerekli değildir.

Eğer kullanıyorsanız @ControllerBahar web MVC bir görünüm döndürebilirsiniz.


Evet, @ResponseBody bir yönteme konabilir ve dönüş türünün doğrudan HTTP yanıt gövdesine yazılması gerektiğini (ve bir Modelde yer almaması veya görünüm adı olarak yorumlanmaması gerektiğini)
belirtir.


14

Aslında, dikkatli olun - tam olarak aynı değildirler.

Başvurunuz dahilinde herhangi bir önleme aracı tanımlarsanız, ek açıklama olarak eklenmiş Kontrolörlere uygulanmazlar @RestControllerancak@Controller ek açıklama eklenmiş kontrol cihazlarıyla .

yani. önleme için yapılandırma:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
    }

}

ve bir Bahar kontrolörünün beyanında:

@Controller
public class AdminServiceController {...

Ancak çalışacak

@RestController
public class AdminServiceController {...

sonlandırıcının kendisiyle ilişkilendirilmesini sağlamaz.


2
@RestControllerİlkbahar 4x'te tanıtıldı. Bu ek açıklama aynı zamanda kendisi tarafından açıklanır, @Controllerbu yüzden eğer bir işe yaramazsa bunu @Controllerbir hata olarak bildirin.
gaoagong

@bertybro, bu pek doğru değil. Bir ilişkilendirebilirsiniz Interceptorbir etmek @RestController.
Ravi-A-Doer

Kesinlikle başarıyla bir Interceptora ekledim @RestController.
Ben Barden


4

Sınıfı, her yöntemin bir görünüm yerine bir etki alanı nesnesi döndürdüğü bir denetleyici olarak işaretleyen Spring4 + 'daki yeni @RestController ek açıklaması. @Controller ve @ResponseBody'nin birlikte yuvarlanması için kestirme yol.


3

@RestControllerBahar 4.0.1'den beri verilmiştir. Bu denetleyiciler , @RequestMapping yöntemlerinin varsayılan olarak @ResponseBody anlambilimini aldığını belirtir.

Önceki sürümlerde, benzer işlevler aşağıdakiler kullanılarak elde edilebilir:

  1. @RequestMappingile bağlanmış @ResponseBodygibi@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. <mvc:annotation-driven/> JSON'u Jackson veya xml ile kullanmanın yollarından biri olarak kullanılabilir.

  3. MyBean şöyle tanımlanabilir

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

  1. @ResponseBody burada MVC arasında görünüm olarak kabul edilir ve bunun yerine doğrudan Dispatcher Servlet'ten gönderilir ve ilgili dönüştürücüler yanıtı text / html, application / xml, application / json gibi ilgili formatta dönüştürür.

Ancak, Restcontroller zaten ResponseBody ve ilgili dönüştürücülerle birleştirilmiştir. İkincisi, burada, yanıtı dönüştürmek yerine, otomatik olarak http yanıtına dönüştürülür.


2

@Controllerdöner View. @RestControllerdöner ResponseBody.


2
Daha fazla açıklamalısın. Bu soruya nasıl cevap veriyor?
Yunnosch

@Yunnosch 'view', jsp veya html gibi kullanıcı arabiriminizdir.
Vücut

Yararlı bilgiler eklemek için lütfen yanıtınızı düzenleyin . Ancak yine de soruyu nasıl cevaplaması gerektiğini anlamıyorum. "Evet yapabilirsin / Hayır yapamazsın, çünkü ...." gibi bir açıklama yapabilir misin?
Yunnosch

1

@RestController ek açıklaması, RESTful web hizmetlerinin oluşturulmasını kolaylaştırmak için Bahar 4.0'da tanıtıldı. @Controller ve @ResponseBody'yi birleştiren bir kolaylık ek açıklamasıdır; bu, denetleyici sınıfının her istek işleme yöntemine @ResponseBody ek açıklamasıyla ek açıklama koyma ihtiyacını ortadan kaldırır.


0
  • @Controller: Bu açıklama yalnızca özel bir sürümüdür @Componentve denetleyici sınıflarının sınıf yolu taramasına göre otomatik olarak algılanmasına olanak tanır.
  • @RestController: Bu ek açıklama otomatik olarak @Controllereklenen @Controllerve @ResponseBodyek açıklama içeren özel bir sürümdür, bu nedenle @ResponseBodyeşleme yöntemlerimize eklememiz gerekmez .

0

@Controller, JSP kullanan eski sistemlerde kullanılır. Gösterim döndürebilir. @RestController denetleyicinin JSON yanıt türü ile REST hizmetleri sağladığını işaretlemektir. böylece @Controller ve @ResponseBody ek açıklamalarını birlikte sarar.


-3

@RestControllerbileşimidir @Controllerve @ResponseBodyeğer @ResponseBodyYöntem imzasını kullanmıyorsak @Restcontroller,.


-3

@Controller ve @ResponseBody kullanmak yerine, @RestController, Spring 4.0 ve sonraki sürümlerde Rest API'lerini ortaya koyalım.


Sen söylemek istiyorum ben @RestController da otomatik JSON / XML yanıtı dönüştürür düşünüyorum. ? açık bir şekilde açıklamak yerine soyut bir cümle kullandınız, bunu tavsiye etmem.
cinqS

Düşünmeye gelelim, @Controller hte türlerini JSON / XML üretiyor ve tüketiyor gibi yapıyor. RestController bunu örtük olarak yapar.
CoffeeBeanie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.