Rumah > Java > Penduaan RequestHeader dalam pengawal Java Spring Boot

Penduaan RequestHeader dalam pengawal Java Spring Boot

WBOY
Lepaskan: 2024-02-06 11:36:10
ke hadapan
626 orang telah melayarinya
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)));

}
Salin selepas log masuk

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)));

    }
Salin selepas log masuk

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
    }
    
    Salin selepas log masuk
  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);
        }
    }
    
    Salin selepas log masuk
  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;
        }
    }
    
    Salin selepas log masuk

    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));
    }
    
    Salin selepas log masuk

    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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan