ความแตกต่างระหว่างสปริง@Controller
และ@RestController
หมายเหตุประกอบ
สามารถใช้@Controller
คำอธิบายประกอบสำหรับทั้งแอปพลิเคชัน Web MVC และ REST ได้หรือไม่
ถ้าใช่เราจะแยกความแตกต่างได้อย่างไรว่าเป็นแอปพลิเคชัน Web MVC หรือ REST
ความแตกต่างระหว่างสปริง@Controller
และ@RestController
หมายเหตุประกอบ
สามารถใช้@Controller
คำอธิบายประกอบสำหรับทั้งแอปพลิเคชัน Web MVC และ REST ได้หรือไม่
ถ้าใช่เราจะแยกความแตกต่างได้อย่างไรว่าเป็นแอปพลิเคชัน Web MVC หรือ REST
คำตอบ:
@Controller
ใช้เพื่อทำเครื่องหมายคลาสเป็น Spring MVC Controller@RestController
เป็นคำอธิบายประกอบที่สะดวกไม่ทำอะไรมากไปกว่าการเพิ่ม@Controller
และ@ResponseBody
คำอธิบายประกอบ (ดู: Javadoc )ดังนั้นนิยามสองตัวควบคุมต่อไปนี้ควรทำเช่นเดียวกัน
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleaf
นี้มันจะไม่ทำงาน@RestController
เพราะ@ResponseBody
สิ่งที่รวมอยู่ในคำอธิบายประกอบนี้
@ResponseBody
ทำให้วัตถุที่ส่งกลับไปยังสิ่งที่อาจจะมีในร่างกายเช่น JSON หรือ XML ( แหล่งที่มา )
ในรหัสด้านล่างฉันจะแสดงให้คุณเห็นความแตกต่างระหว่าง @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
คุณไม่สามารถส่งคืนมุมมอง (โดยใช้Viewresolver
ใน Spring / springboot) และ@ResponseBody
ไม่จำเป็นต้องใช้ในกรณีนี้
หากคุณใช้@Controller
คุณสามารถส่งคืนมุมมองใน Spring web MVC
@RestController
คลาสที่ทำหมายเหตุประกอบไว้จะเหมือนกับ@Controller
แต่@ResponseBody
ในเมธอดตัวจัดการนั้นจะบอกเป็นนัย
ที่จริงแล้วควรระวัง - มันไม่เหมือนกันทั้งหมด
หากคุณกำหนดตัวดักภายในแอปพลิเคชันของคุณพวกมันจะไม่นำไปใช้กับตัวควบคุมที่มีคำอธิบายประกอบเป็น@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 ที่เกี่ยวข้อง
@RestController
เปิดตัวในฤดูใบไม้ผลิ 4x คำอธิบายประกอบนี้ยังมีบันทึกย่อตัวเองด้วย@Controller
ดังนั้นหากมันไม่ทำงานเหมือน@Controller
แล้วรายงานว่าเป็นข้อผิดพลาด
Interceptor
@RestController
Interceptor
@RestController
ดังที่คุณเห็นในเอกสารประกอบของ Spring (เอกสารประกอบSpring RestController ) คำอธิบายประกอบส่วนที่เหลือของตัวควบคุมเหมือนกับคำอธิบายประกอบของตัวควบคุม แต่สมมติว่า @ResponseBody ใช้งานโดยค่าเริ่มต้นดังนั้น json ทั้งหมดจะถูกแยกวิเคราะห์วัตถุ Java
คำอธิบายประกอบ @RestController ใหม่ใน Spring4 + ซึ่งทำเครื่องหมายคลาสเป็นตัวควบคุมโดยที่ทุกเมธอดส่งคืนวัตถุโดเมนแทนมุมมอง มันเป็นชวเลขสำหรับ @Controller และ @ResponseBody ที่ม้วนเข้าด้วยกัน
@RestController
ให้บริการตั้งแต่ Spring 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
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@ResponseBody
จะถือว่าเป็นมุมมองที่นี่ในหมู่ MVC และจะถูกส่งโดยตรงแทนที่จะถูกส่งจาก Dispatcher Servlet และผู้แปลงตามลำดับจะแปลงการตอบสนองในรูปแบบที่เกี่ยวข้องเช่น text / html, application / xml, application / jsonอย่างไรก็ตาม Restcontroller เชื่อมต่อกับ ResponseBody และตัวแปลงที่เกี่ยวข้องแล้ว ประการที่สองที่นี่เนื่องจากแทนที่จะแปลงการตอบกลับจะถูกแปลงเป็นการตอบสนอง http โดยอัตโนมัติ
คำอธิบายประกอบ @RestController ถูกนำมาใช้ใน Spring 4.0 เพื่อทำให้การสร้างบริการเว็บสงบ เป็นคำอธิบายประกอบที่สะดวกสบายที่รวม @Controller และ @ResponseBody ซึ่งไม่จำเป็นต้องใส่คำอธิบายประกอบทุกวิธีการจัดการคำขอของคลาสคอนโทรลเลอร์ด้วยคำอธิบายประกอบ @ResponseBody
@Controller
: คำอธิบายประกอบนี้เป็นเพียงรุ่นพิเศษ@Component
และอนุญาตให้คลาสตัวควบคุมตรวจพบอัตโนมัติตามการสแกนคลาสพา ธ@RestController
: คำอธิบายประกอบนี้เป็นรุ่นพิเศษ@Controller
ที่เพิ่ม@Controller
และใส่@ResponseBody
คำอธิบายประกอบโดยอัตโนมัติดังนั้นเราไม่จำเป็นต้องเพิ่ม@ResponseBody
วิธีการทำแผนที่ของเรา@Controller ใช้ในระบบเดิมที่ใช้ JSP มันสามารถกลับมาดู @RestController คือการทำเครื่องหมายว่าคอนโทรลเลอร์กำลังให้บริการ REST พร้อมกับชนิดการตอบกลับ JSON ดังนั้นจึงหุ้มคำอธิบายประกอบ @Controller และ @ResponseBody ไว้ด้วยกัน
@RestController
เป็นองค์ประกอบของ@Controller
และ@ResponseBody
ถ้าเราไม่ได้ใช้ในลายเซ็นวิธีแล้วเราจำเป็นต้องใช้@ResponseBody
@Restcontroller
แทนที่จะใช้ @Controller และ @ResponseBody @RestController ให้คุณแสดง Rest APIs ใน Spring 4.0 ขึ้นไป