Rumah >Java >Penduaan RequestHeader dalam pengawal Java Spring Boot

Penduaan RequestHeader dalam pengawal Java Spring Boot

WBOY
WBOYke hadapan
2024-02-06 11:36:10619semak imbas
Kandungan soalan

Saya mempunyai satu set pengawal rehat yang ditulis dalam java. Keperluan awal adalah untuk menambah beberapa pengepala untuk beberapa titik akhir, tetapi kami memutuskan untuk menambah medan pengepala ini dalam hampir semua pengawal rehat. Projek ini kini mengandungi lebih 100 API serupa:

@getmapping("/products/{comp}")
public responseentity<list<product>> getallproducts(
        @requestheader(user_hdr) string user,
        @requestheader(guid_hdr) string guid,
        @requestheader(value = caller_hdr, required = false) string caller,
        @requestheader(value = lang_hdr, required = false) string language,
        @pathvariable @notnull integer comp
) {

    return responseentity.ok(service.get(comp, productutils.processheaders(user,guid,caller,language)));

}

@getmapping("/products")
public responseentity<list<product>> getallproducts(
        @requestheader(user_hdr) string user,
        @requestheader(guid_hdr) string guid,
        @requestheader(value = caller_hdr, required = false) string caller,
        @requestheader(value = lang_hdr, required = false) string language
) {

   return responseentity.ok(service.getallrecords(productutils.processheaders(user,guid,caller,language)));

}

Ia jelas daripada kod bahawa tuple pengguna, panduan, pemanggil, bahasa terdapat di mana-mana dalam kod sumber, tetapi, bagaimana untuk memfaktorkan semula dan meletakkan kod di "satu tempat" atau cuba menjadikannya lebih kaya, itu tidak Adakah ia jelas? Boleh dikekalkan. Sebagai contoh, jika kita perlu menambah parameter ke-5, kita perlu menggunakan 100 apis.

Apakah cara kanonik untuk melakukan ini dalam but spring java?

Sebaik-baiknya saya ingin sesuatu seperti ini:

@GetMapping("/products/{comp}")
    public ResponseEntity<List<Product>> getAllProducts(
            "common handling"
            @PathVariable @NotNull Integer comp
    ) {

        return ResponseEntity.ok(service.get(comp, ProductUtils.processHeaders(user,guid,caller,language)));

    }

    @GetMapping("/products")
    public ResponseEntity<List<Product>> getAllProducts(
            "common handling"
    ) {

       return ResponseEntity.ok(service.getAllRecords(ProductUtils.processHeaders(user,guid,caller,language)));

    }

Ada idea? Cadangan pengawal? Ada lagi ke?


Jawapan betul


Untuk menyelesaikan masalah pertindihan kod dan menjadikan kod lebih boleh diselenggara dalam aplikasi but spring, anda boleh mencipta penapis tersuai untuk mengekstrak dan memproses pengepala awam sebelum ia mencapai pengawal. Selain itu, anda juga boleh merangkum parameter pengepala ke dalam objek untuk meningkatkan kebolehbacaan dan kebolehselenggaraan kod.

Ringkasnya, pusatkan pemprosesan pengepala dengan mencipta requestheaders dto、实现 customheaderfilter 并将其注册到 filterregistrationbean untuk menggunakan pengepala biasa secara seragam dalam pengawal but spring.

Berikut adalah kaedah yang dicadangkan:

  1. Buat pengepala dto (objek pemindahan data):

    Tentukan kelas yang mewakili parameter pengepala awam. Kelas ini akan memegang nilai yang diekstrak daripada pengepala.

    public class requestheaders {
        private string user;
        private string guid;
        private string caller;
        private string language;
    
        // getters and setters
    }
    
  2. Buat penapis:

    Laksanakan penapis untuk memintas permintaan masuk dan mengekstrak pengepala awam, kemudian simpannya dalam sifat permintaan.

    import org.springframework.web.filter.onceperrequestfilter;
    import javax.servlet.filterchain;
    import javax.servlet.servletexception;
    import javax.servlet.http.httpservletrequest;
    import javax.servlet.http.httpservletresponse;
    import java.io.ioexception;
    
    public class customheaderfilter extends onceperrequestfilter {
        @override
        protected void dofilterinternal(httpservletrequest request, httpservletresponse response, filterchain filterchain)
                throws servletexception, ioexception {
    
            requestheaders headers = new requestheaders();
            headers.setuser(request.getheader("user"));
            headers.setguid(request.getheader("guid"));
            headers.setcaller(request.getheader("caller"));
            headers.setlanguage(request.getheader("language"));
    
            request.setattribute("requestheaders", headers);
    
            filterchain.dofilter(request, response);
        }
    }
    
  3. Gunakan filterregistrationbean untuk mendaftarkan penapis:

    Gunakan filterregistrationbean dalam kelas aplikasi utama untuk mendaftar penapis tersuai.

    import org.springframework.boot.web.servlet.filterregistrationbean;
    import org.springframework.context.annotation.bean;
    import org.springframework.context.annotation.configuration;
    
    @configuration
    public class webconfig {
        @bean
        public filterregistrationbean<customheaderfilter> customheaderfilter() {
            filterregistrationbean<customheaderfilter> registrationbean = new filterregistrationbean<>();
            registrationbean.setfilter(new customheaderfilter());
            registrationbean.addurlpatterns("/api/*"); // adjust the url pattern as needed
            return registrationbean;
        }
    }
    

    Sesuaikan kaedah addurlpatterns untuk memadankan url yang anda ingin gunakan penapis.

  4. Ubah suai pengawal untuk menggunakan dto:

    Ubah suai pengawal anda untuk menggunakan requestheaders dto dan bukannya parameter pengepala yang berasingan.

    @GetMapping("/products/{comp}")
    public ResponseEntity<List<Product>> getAllProducts(@PathVariable @NotNull Integer comp,
                                                        @ModelAttribute("requestHeaders") RequestHeaders headers) {
        return ResponseEntity.ok(service.get(comp, headers));
    }
    
    @GetMapping("/products")
    public ResponseEntity<List<Product>> getAllProducts(@ModelAttribute("requestHeaders") RequestHeaders headers) {
        return ResponseEntity.ok(service.getAllRecords(headers));
    }
    

Sekarang, jika anda perlu menambah parameter pengepala baharu atau membuat perubahan, anda hanya mengemas kini kelas requestheaders dan logik penapis. Pendekatan ini memusatkan pemprosesan pengepala dan meningkatkan kebolehselenggaraan.

Atas ialah kandungan terperinci Penduaan RequestHeader dalam pengawal Java Spring Boot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam