Spring: ฉันจะฉีด HttpServletRequest ลงใน request-scoped bean ได้อย่างไร


96

ฉันกำลังพยายามตั้งค่าrequest-scoped beanใน Spring

ฉันตั้งค่าสำเร็จแล้วดังนั้นจึงสร้าง bean หนึ่งครั้งต่อคำขอ ตอนนี้จำเป็นต้องเข้าถึงวัตถุ HttpServletRequest

เนื่องจาก bean ถูกสร้างขึ้นหนึ่งครั้งต่อคำขอฉันจึงคิดว่าคอนเทนเนอร์สามารถฉีดวัตถุร้องขอใน bean ของฉันได้อย่างง่ายดาย ฉันจะทำเช่นนั้นได้อย่างไร?

คำตอบ:


117

Request-scoped beans สามารถกำหนดอัตโนมัติด้วยออบเจ็กต์คำขอ

private @Autowired HttpServletRequest request;

2
มีวิธี XML แบบเก่าสำหรับสิ่งนี้หรือไม่?
cherouvim

2
ไม่ได้ผลสำหรับฉัน (สปริง mvc 3.1) - อาจมีอะไรมากกว่านั้นที่ต้องทำ? ไปกับน้ำยาสามมิตร.
kldavis4

2
ปัญหาคือเมื่อคุณทดสอบตัวตรวจสอบความถูกต้องโดยใช้ MockMvc และการฉีดแบบนี้คุณจะมีปัญหา อาจเป็นทางเลือกอื่นในกรณีนี้
Neyko

21
เป็นไปได้ที่จะกำหนดค่า HttpServletRequest โดยอัตโนมัติในถั่วที่ไม่กำหนดขอบเขตคำขอเนื่องจากสำหรับ HttpServletRequest Spring จะสร้างพร็อกซี HttpServletRequest ซึ่งรับทราบวิธีรับอินสแตนซ์คำขอที่แท้จริง ดังนั้นจึงปลอดภัยที่จะส่งคำขออัตโนมัติแม้ว่าคอนโทรลเลอร์ของคุณจะอยู่ในขอบเขตซิงเกิลตันก็ตาม
vtor

3
คำเตือนสำหรับผู้ใช้ Spring <= 3.1การเดินสายอัตโนมัติจะไม่ทำงานการทดสอบที่กำลังทำงานอยู่
Rubens Mariuzzo

140

ฤดูใบไม้ผลิ exposes ปัจจุบันHttpServletRequestวัตถุ (เช่นเดียวกับปัจจุบันHttpSessionวัตถุ) ผ่านการห่อหุ้มServletRequestAttributesวัตถุประเภท วัตถุเสื้อคลุมนี้ถูกผูกไว้กับ ThreadLocal และจะได้รับโดยการเรียกวิธีstaticRequestContextHolder.currentRequestAttributes()

ServletRequestAttributesให้วิธีgetRequest()การรับคำขอปัจจุบันgetSession()เพื่อรับเซสชันปัจจุบันและวิธีการอื่น ๆ เพื่อรับแอตทริบิวต์ที่เก็บไว้ในทั้งสองขอบเขต รหัสต่อไปนี้แม้ว่าจะดูน่าเกลียดเล็กน้อย แต่ก็ควรให้คุณได้รับวัตถุคำขอปัจจุบันที่ใดก็ได้ในแอปพลิเคชัน:

HttpServletRequest curRequest = 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();

โปรดทราบว่าRequestContextHolder.currentRequestAttributes()วิธีนี้จะส่งคืนอินเทอร์เฟซและจำเป็นต้องพิมพ์ลงServletRequestAttributesในอินเทอร์เฟซที่ใช้


Spring Javadoc: RequestContextHolder | ServletRequestAttributes


8
การฉีดเป็นความละเอียดที่ดี แต่ฉันพบปัญหากับการทดสอบ MockMvc Spring validators ซึ่งฉีด HttpServletRequest ดังนั้นหากคุณต้องการให้ทั้งการทดสอบจำลองและรหัสการผลิตทำงานอย่างถูกต้องควรเป็นทางเลือก
Neyko

@ นีย์โกะเป็นไฉน? สำหรับการทดสอบจำลอง (การทดสอบหน่วย?) คุณสามารถฉีดจำลอง HttpServletRequest หรืออะไรก็ได้ที่คุณต้องการ .. ไม่ใช่เหรอ? หรือคุณสามารถใช้ MockHttpServletRequest ฉันเดา?
วอนฮี

ปลอดภัยไหมที่จะใช้ในอินสแตนซ์บริการที่กำหนดขอบเขตเดี่ยว
Jin Kwon

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.