[Java] Разница между примечанием @Controller от источника и @RestController


Answers

в приведенном ниже коде я покажу вам разницу с @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 активируется по умолчанию, вам не нужно добавлять его в приведенное выше выражение функции

Question

Разница между @Controller и @RestController .

Может @Controller аннотация @Controller использоваться как для приложений Web MVC, так и для REST?
Если да, то как мы можем дифференцировать, если это приложение Web MVC или REST.




@RestController - это состав @Controller и @ResponseBody , если мы не используем подпись @ResponseBody в методе, тогда нам нужно использовать @Restcontroller .




Если вы используете @RestController, вы не можете вернуть представление (используя Viewresolver в Spring / springboot), и да @ResponseBody в этом случае не требуется.

Если вы используете @controller, вы можете вернуть представление в Spring webMVC.




Собственно, будьте осторожны - они не совсем то же самое.

Если вы определите какие-либо перехватчики в своем приложении, они не будут применяться к контроллерам, аннотированным как @RestController , однако они работают с аннотированными контроллерами @Controller .

то есть. конфигурация для перехватчика:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


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

}

и в объявлении контроллера Spring:

@Controller
public class AdminServiceController {...

Будет работать, однако

@RestController
public class AdminServiceController {...

не приводит к тому, что перехватчик связан с ним.




@RestController был предоставлен с Spring 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, и он отправляется напрямую, вместо этого отправляется из диспетчера Servlet, а соответствующие конвертеры преобразуют ответ в соответствующем формате, например text / html, application / xml, application / json.

Однако Restcontroller уже связан с ResponseBody и соответствующими преобразователями. Во-вторых, здесь, поскольку вместо преобразования тела ответа он автоматически преобразуется в HTTP-ответ.