Saya bekerja dengan Spring Framework 4.0.7, bersama dengan MVC dan Rest
Saya dapat bekerja dalam damai dengan:
@Controller
ResponseEntity<T>
Sebagai contoh:
@Controller
@RequestMapping("/person")
@Profile("responseentity")
public class PersonRestResponseEntityController {
Dengan metode (hanya untuk membuat)
@RequestMapping(value="/", method=RequestMethod.POST)
public ResponseEntity<Void> createPerson(@RequestBody Person person, UriComponentsBuilder ucb){
logger.info("PersonRestResponseEntityController - createPerson");
if(person==null)
logger.error("person is null!!!");
else
logger.info("{}", person.toString());
personMapRepository.savePerson(person);
HttpHeaders headers = new HttpHeaders();
headers.add("1", "uno");
//http://localhost:8080/spring-utility/person/1
headers.setLocation(ucb.path("/person/{id}").buildAndExpand(person.getId()).toUri());
return new ResponseEntity<>(headers, HttpStatus.CREATED);
}
untuk mengembalikan sesuatu
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public ResponseEntity<Person> getPerson(@PathVariable Integer id){
logger.info("PersonRestResponseEntityController - getPerson - id: {}", id);
Person person = personMapRepository.findPerson(id);
return new ResponseEntity<>(person, HttpStatus.FOUND);
}
Bekerja dengan baik
Saya dapat melakukan hal yang sama dengan :
@RestController
(Saya tahu ini sama dengan@Controller
+@ResponseBody
)@ResponseStatus
Sebagai contoh:
@RestController
@RequestMapping("/person")
@Profile("restcontroller")
public class PersonRestController {
Dengan metode (hanya untuk membuat)
@RequestMapping(value="/", method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void createPerson(@RequestBody Person person, HttpServletRequest request, HttpServletResponse response){
logger.info("PersonRestController - createPerson");
if(person==null)
logger.error("person is null!!!");
else
logger.info("{}", person.toString());
personMapRepository.savePerson(person);
response.setHeader("1", "uno");
//http://localhost:8080/spring-utility/person/1
response.setHeader("Location", request.getRequestURL().append(person.getId()).toString());
}
untuk mengembalikan sesuatu
@RequestMapping(value="/{id}", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.FOUND)
public Person getPerson(@PathVariable Integer id){
logger.info("PersonRestController - getPerson - id: {}", id);
Person person = personMapRepository.findPerson(id);
return person;
}
Pertanyaan saya adalah:
- ketika karena alasan yang kuat atau skenario tertentu, satu opsi harus digunakan secara wajib di atas yang lain
- Jika (1) tidak masalah, pendekatan apa yang disarankan dan mengapa.
sumber
ResponseEntity
, lebih fleksibel. Hanya saya dengan keraguan tentang@RestController
. Terima kasihUntuk melengkapi jawaban dari Sotorios Delimanolis.
Memang benar
ResponseEntity
memberi Anda lebih banyak fleksibilitas tetapi dalam kebanyakan kasus Anda tidak akan membutuhkannya dan Anda akan berakhir dengan iniResponseEntity
di mana - mana di controller Anda sehingga membuatnya sulit untuk dibaca dan dipahami.Jika Anda ingin menangani kasus-kasus khusus seperti kesalahan (Tidak Ditemukan, Konflik, dll.), Anda dapat menambahkannya
HandlerExceptionResolver
ke konfigurasi Spring Anda. Jadi dalam kode Anda, Anda cukup melempar pengecualian khusus (NotFoundException
misalnya) dan memutuskan apa yang harus dilakukan di Handler Anda (mengatur status HTTP ke 404), membuat kode Pengontrol lebih jelas.sumber
Menurut dokumentasi resmi: Membuat Pengendali REST dengan anotasi @RestController
Tampaknya itu yang terbaik untuk digunakan
@RestController
untuk kejelasan, tetapi Anda juga dapat menggabungkannya denganResponseEntity
untuk fleksibilitas ketika diperlukan ( Menurut tutorial resmi dan kode di sini dan pertanyaan saya untuk mengonfirmasi itu ).Sebagai contoh:
sama dengan:
Dengan cara ini, Anda
ResponseEntity
hanya dapat mendefinisikan bila diperlukan.Memperbarui
Anda bisa menggunakan ini:
sumber
@ResponseStatus(HttpStatus.OK)
diabaikan saat Anda kembaliResponseEntity<>(user, responseHeaders, HttpStatus.NOT_FOUND)
. Respons HTTP adalah404
API REST yang tepat harus memiliki komponen di bawah sebagai respons
Tujuan utama ResponseEntity adalah untuk menyediakan opsi 3, opsi lainnya dapat dicapai tanpa ResponseEntity.
Jadi jika Anda ingin memberikan lokasi sumber daya maka menggunakan ResponseEntity akan lebih baik kalau tidak bisa dihindari.
Pertimbangkan contoh di mana API dimodifikasi untuk menyediakan semua opsi yang disebutkan
Sumber - Musim Semi Beraksi
sumber