ความแตกต่างระหว่างคำอธิบายประกอบ @Controller ของสปริงและ @RestController


356

ความแตกต่างระหว่างสปริง@Controllerและ@RestControllerหมายเหตุประกอบ

สามารถใช้@Controllerคำอธิบายประกอบสำหรับทั้งแอปพลิเคชัน Web MVC และ REST ได้หรือไม่
ถ้าใช่เราจะแยกความแตกต่างได้อย่างไรว่าเป็นแอปพลิเคชัน Web MVC หรือ REST

คำตอบ:


471
  • @Controller ใช้เพื่อทำเครื่องหมายคลาสเป็น Spring MVC Controller
  • @RestControllerเป็นคำอธิบายประกอบที่สะดวกไม่ทำอะไรมากไปกว่าการเพิ่ม@Controllerและ@ResponseBodyคำอธิบายประกอบ (ดู: Javadoc )

ดังนั้นนิยามสองตัวควบคุมต่อไปนี้ควรทำเช่นเดียวกัน

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


48
ฉันคิดว่า @RestController ยังแปลงการตอบสนองต่อ JSON / XML โดยอัตโนมัติ
arnabkaycee

1
เพียงแชร์ลิงก์ไปที่บทช่วยสอนเกี่ยวกับฤดูใบไม้ผลิเพื่ออธิบายความแตกต่างของspring.io/guides/gs/rest-service
Mina Samy

9
นอกจากนี้หากคุณใช้แม่แบบเอ็นจิ้นแบบThymeleafนี้มันจะไม่ทำงาน@RestControllerเพราะ@ResponseBodyสิ่งที่รวมอยู่ในคำอธิบายประกอบนี้
Sonique

3
@ResponseBodyทำให้วัตถุที่ส่งกลับไปยังสิ่งที่อาจจะมีในร่างกายเช่น JSON หรือ XML ( แหล่งที่มา )
มาร์ติน Thoma

59

ในรหัสด้านล่างฉันจะแสดงให้คุณเห็นความแตกต่างระหว่าง @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ถูกเปิดใช้งานโดยค่าเริ่มต้น คุณไม่จำเป็นต้องเพิ่มมันเหนือลายเซ็นของฟังก์ชั่น


1
ชื่อคลาสใน Java ควรเริ่มต้นด้วยตัวพิมพ์ใหญ่เช่น RestClassName (ไม่ใช่ restClassName)
Razzle

24

หากคุณใช้@RestControllerคุณไม่สามารถส่งคืนมุมมอง (โดยใช้Viewresolverใน Spring / springboot) และ@ResponseBodyไม่จำเป็นต้องใช้ในกรณีนี้

หากคุณใช้@Controllerคุณสามารถส่งคืนมุมมองใน Spring web MVC


ใช่ @ResponseBody สามารถใส่วิธีการและระบุว่าประเภทการส่งคืนควรจะเขียนตรงไปยังเนื้อหาการตอบสนอง HTTP (และไม่ได้อยู่ในรูปแบบหรือตีความเป็นชื่อมุมมอง)
PraveenKumar Lalasangi


14

ที่จริงแล้วควรระวัง - มันไม่เหมือนกันทั้งหมด

หากคุณกำหนดตัวดักภายในแอปพลิเคชันของคุณพวกมันจะไม่นำไปใช้กับตัวควบคุมที่มีคำอธิบายประกอบเป็น@RestControllerอย่างไรก็ตามพวกมันจะทำงานร่วมกับ@Controllerตัวควบคุมที่มีคำอธิบายประกอบ

กล่าวคือ การกำหนดค่าสำหรับ interceptor:

@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 {...

ไม่ได้จบลงที่การมี interceptor ที่เกี่ยวข้อง


2
@RestControllerเปิดตัวในฤดูใบไม้ผลิ 4x คำอธิบายประกอบนี้ยังมีบันทึกย่อตัวเองด้วย@Controllerดังนั้นหากมันไม่ทำงานเหมือน@Controllerแล้วรายงานว่าเป็นข้อผิดพลาด
gaoagong

@bertybro นั่นไม่ถูกต้องนัก คุณสามารถเชื่อมโยงไปยังInterceptor @RestController
Ravi-A-Doer

ผมได้แนบแน่นอนประสบความสำเร็จกับInterceptor @RestController
Ben Barden

11

ดังที่คุณเห็นในเอกสารประกอบของ Spring (เอกสารประกอบSpring RestController ) คำอธิบายประกอบส่วนที่เหลือของตัวควบคุมเหมือนกับคำอธิบายประกอบของตัวควบคุม แต่สมมติว่า @ResponseBody ใช้งานโดยค่าเริ่มต้นดังนั้น json ทั้งหมดจะถูกแยกวิเคราะห์วัตถุ Java


4

คำอธิบายประกอบ @RestController ใหม่ใน Spring4 + ซึ่งทำเครื่องหมายคลาสเป็นตัวควบคุมโดยที่ทุกเมธอดส่งคืนวัตถุโดเมนแทนมุมมอง มันเป็นชวเลขสำหรับ @Controller และ @ResponseBody ที่ม้วนเข้าด้วยกัน


3

@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 และจะถูกส่งโดยตรงแทนที่จะถูกส่งจาก Dispatcher Servlet และผู้แปลงตามลำดับจะแปลงการตอบสนองในรูปแบบที่เกี่ยวข้องเช่น text / html, application / xml, application / json

อย่างไรก็ตาม Restcontroller เชื่อมต่อกับ ResponseBody และตัวแปลงที่เกี่ยวข้องแล้ว ประการที่สองที่นี่เนื่องจากแทนที่จะแปลงการตอบกลับจะถูกแปลงเป็นการตอบสนอง http โดยอัตโนมัติ


2

@ControllerViewผลตอบแทน ผลตอบแทน@RestControllerResponseBody


2
คุณควรอธิบายเพิ่มเติม สิ่งนี้จะตอบคำถามได้อย่างไร
Yunnosch

@Yunnosch 'view' เป็นส่วนหน้าของคุณเช่น jsp หรือ html การตอบสนองร่างกายสามารถเป็น xml, json, yaml
G.Brown

โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มข้อมูลที่เป็นประโยชน์ อย่างไรก็ตามฉันยังไม่เข้าใจว่าควรตอบคำถามอย่างไร คุณช่วยอธิบายคำว่า "ใช่คุณทำได้ / ไม่สามารถทำได้เพราะ .... "?
Yunnosch

1

คำอธิบายประกอบ @RestController ถูกนำมาใช้ใน Spring 4.0 เพื่อทำให้การสร้างบริการเว็บสงบ เป็นคำอธิบายประกอบที่สะดวกสบายที่รวม @Controller และ @ResponseBody ซึ่งไม่จำเป็นต้องใส่คำอธิบายประกอบทุกวิธีการจัดการคำขอของคลาสคอนโทรลเลอร์ด้วยคำอธิบายประกอบ @ResponseBody


0
  • @Controller: คำอธิบายประกอบนี้เป็นเพียงรุ่นพิเศษ@Componentและอนุญาตให้คลาสตัวควบคุมตรวจพบอัตโนมัติตามการสแกนคลาสพา ธ
  • @RestController: คำอธิบายประกอบนี้เป็นรุ่นพิเศษ@Controllerที่เพิ่ม@Controllerและใส่@ResponseBodyคำอธิบายประกอบโดยอัตโนมัติดังนั้นเราไม่จำเป็นต้องเพิ่ม@ResponseBodyวิธีการทำแผนที่ของเรา

0

@Controller ใช้ในระบบเดิมที่ใช้ JSP มันสามารถกลับมาดู @RestController คือการทำเครื่องหมายว่าคอนโทรลเลอร์กำลังให้บริการ REST พร้อมกับชนิดการตอบกลับ JSON ดังนั้นจึงหุ้มคำอธิบายประกอบ @Controller และ @ResponseBody ไว้ด้วยกัน


-3

@RestControllerเป็นองค์ประกอบของ@Controllerและ@ResponseBodyถ้าเราไม่ได้ใช้ในลายเซ็นวิธีแล้วเราจำเป็นต้องใช้@ResponseBody@Restcontroller


-3

แทนที่จะใช้ @Controller และ @ResponseBody @RestController ให้คุณแสดง Rest APIs ใน Spring 4.0 ขึ้นไป


คุณต้องการบอกว่าฉันคิดว่า @RestController แปลงการตอบสนองเป็น JSON / XML โดยอัตโนมัติเช่นกัน ? คุณใช้ประโยคที่เป็นนามธรรมแทนที่จะอธิบายอย่างชัดเจนฉันจะไม่แนะนำมัน
cinqS

ลองคิดดูสิ @Controller ทำเช่นเดียวกันกับที่ hte สร้างและใช้ mime type JSON / XML หรือมิฉะนั้น ... @ ResponseBody บอกให้ Controller ทำตัวเหมือน REST endpoint โดยไม่สร้างมุมมอง RestController โดยปริยายทำเช่นนั้น
CoffeeBeanie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.