HTTPServletRequest และ HTTPServletResponse ไม่ได้เต็มไปด้วย @Context

ฉันยังใหม่กับ DI มากและกำลังประสบปัญหามากมายกับสิ่งพื้นฐานใน JAX-RS

ฉันมีตัวกรองชื่อ SentryAuthFilter ซึ่งคลาสย่อยเป็นคลาสนามธรรมชื่อ AuthFilter AuthFilter ใช้ ContainerRequestFilter, ContainerResponseFilter และ WriterInterceptor เนื่องจาก AuthFilter เป็นแบบนามธรรม วิธีการต่างๆ เช่น configure(), matchResource(), ... จึงถูกนำมาใช้จริงใน SentryAuthFilter() (และคลาสอื่นๆ ที่คลาสย่อย AuthFilter.

ใน SentryFilter ฉันต้องการเข้าถึง HTTPServletRequest และ HTTPServletResponse ในเมธอด filter ของฉัน

@Priority(Priorities.AUTHENTICATION)
public class SentryAuthFilter extends AuthFilter {

    @Context
    private HttpServletRequest request;

    @Context
    private HttpServletResponse response;

    ...



@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
    SentryHttpServletResponseWrapper responseWrapper = new SentryHttpServletResponseWrapper(response);
    try {
        tomcatSSOFilter.doFilter(request, responseWrapper, (request1, response1) -> {});
    } catch (Exception e) {
        LOGGER.error("Error occurred executing TomcatSSOFilter", e);
        requestContext.abortWith(Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build());
        return;
    }

    ...
 }

ปัญหาคือ request และ response เป็นโมฆะ ฉันได้ดูคำถาม 8 ข้อที่แตกต่างกันเกี่ยวกับหัวข้อนี้แล้ว และไม่พบคำถามที่อธิบายวิธีการฉีด HTTPServletRequest และ HTTPServletResponse พวกเขาแค่บอกว่ามันเป็นวัตถุพร็อกซีซิงเกิลตันและคุณไม่จำเป็นต้องฉีดมันอย่างชัดเจน เพียงแค่ใช้ @Context เห็นได้ชัดว่า @Context ไม่ทำงาน

คลาสที่เรียก SentryFilter จริงๆ หรือคลาสอื่นๆ ที่ใช้ AuthFilter เรียกว่า DynamicAuthFilter DynamicAuthFilter นี้ "ลงทะเบียน" ในคลาสที่ใช้ DynamicFeature

@Provider
public class AuthenticationDynamicFeature implements DynamicFeature {

    private final List<javax.inject.Provider<? extends AuthFilter>> filterProviders;

    /**
     * @param permissionAuthFilter permissionAuthFilter
     * @param aaaAuthFilter aaaAuthFilter
     * @param sentryAuthFilter sentryAuthFilter
     */
    @Inject
    public AuthenticationDynamicFeature(final javax.inject.Provider<SomeAuthFilter> someAuthFilter,
                                        final javax.inject.Provider<AnotherAuthFilter> anotherAuthFilter,
                                        final javax.inject.Provider<SentryAuthFilter> sentryAuthFilter) {
        this.filterProviders = ImmutableList.of(someAuthFilter, anotherAuthFilter, sentryAuthFilter);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void configure(final ResourceInfo resourceInfo, final FeatureContext context) {

            List<AuthFilter> filters = filterProviders.stream()
                    .map(javax.inject.Provider::get)
                    .filter(f -> f.matchResource(resourceInfo))
                    .peek(AuthFilter::configure)
                    .collect(Collectors.collectingAndThen(Collectors.toList(), ImmutableList::copyOf));

        context.register(new DynamicAuthFilter(filters));
    }
}

ตามสิ่งนี้ ดูเหมือนว่าการลงทะเบียนบริบทจะเป็นเช่นไร @ กรอกค่าบริบทแล้ว ดังนั้นฉันจึงไม่แน่ใจว่าปัญหาคือการลงทะเบียนใน AuthenticationDynamicFeature ผิดหรือว่าฉันขาดอย่างอื่นไปหรือเปล่า DynamicAuthFilter ไม่ทำอะไรเลยนอกจากโทร SentryFilter, AnotherAuthFilter ฯลฯ ดังนั้นฉันจึงไม่ใช้ @Context ในนั้น

ขออภัยที่โพสต์ยาว แต่ฉันสับสนจริงๆ


person Jeremy Fisher    schedule 09.01.2018    source แหล่งที่มา
comment
อาจเพียงแค่ฉีดด้วยตนเอง   -  person Paul Samsotha    schedule 10.01.2018
comment
ฉันเห็นโพสต์นั้น ฉันจะเข้าถึงวัตถุ HTTPServletRequest และ Response ได้อย่างไร ในโพสต์นั้นผู้ชายคนนั้นผ่านอย่างชัดเจนใน authenticator แต่ฉันจะได้ request หรือ response จากที่ไหน   -  person Jeremy Fisher    schedule 10.01.2018
comment
คุณฉีดตัวกรอง คุณมีตัวกรอง locator.inject (ตัวกรอง)   -  person Paul Samsotha    schedule 10.01.2018
comment
เลยใช้ ServiceLocator ฉีดแล้วลงทะเบียนเลยเหรอ? มันจะเติมค่าคำขอและการตอบสนองได้อย่างไร? ตัวกรองต้องการค่าเหล่านั้น ดังนั้นการแทรกตัวกรองจะทำให้ @Context ฉีด HTTPServletRequest และ HTTPServletResponse ได้อย่างไร   -  person Jeremy Fisher    schedule 10.01.2018
comment
คุณไม่จำเป็นต้องลงทะเบียนมัน เพียงแค่ฉีดมัน ตัวระบุตำแหน่งจะฉีดพรอกซี อ่านส่วนที่เหลือของโพสต์   -  person Paul Samsotha    schedule 10.01.2018
comment
ฉันอ่านแล้ว แต่ฉันแค่สับสนกับสิ่งที่จะฉีดโดยเฉพาะ บรรทัด List<AuthFilter> filters... ทั้งหมดนั้นมีความสำคัญเนื่องจากรวบรวมตัวกรองต่างๆ ที่ระบุไว้สำหรับ API เฉพาะตามคำอธิบายประกอบ DynamicAuthFilter จำเป็นต่อการเรียกตัวกรองเหล่านั้น คุณกำลังบอกว่าวิธี configure ของฉันควรเป็นบรรทัด List<AuthFilter> filters เท่านั้น จากนั้นสร้างวัตถุ DynamicAuthFilter ที่ส่งผ่านตัวกรอง จากนั้นใช้ ServiceLocator เพื่อฉีด DynamicAuthFilter   -  person Jeremy Fisher    schedule 10.01.2018
comment
ใช้ตัวระบุตำแหน่งเพื่อฉีดวัตถุใดๆ ที่คุณต้องการฉีด DynamicAuthFilter ที่คุณต้องการฉีดหรือไม่ ไม่ คุณได้ผ่านตัวกรองทั้งหมดไปแล้ว สิ่งที่คุณต้องการฉีดคือตัวกรองที่ไม่ได้รับคำขอและการตอบกลับ SentryAuthFilter   -  person Paul Samsotha    schedule 10.01.2018
comment
เอาล่ะ มีวิธีอื่นนอกเหนือจาก ServiceLocator ในการฉีด SentryFilter หรือไม่ เห็นได้ชัดว่าการรับ ServiceLocator ในเสื้อเจอร์ซีย์ไม่ใช่เรื่องเล็กน้อย   -  person Jeremy Fisher    schedule 10.01.2018
comment
คุณควรจะสามารถแทรกมันเข้าไปในฟีเจอร์ของคุณได้ เป็นบริการเช่นเดียวกับบริการอื่นๆ   -  person Paul Samsotha    schedule 10.01.2018
comment
คุณมีตัวอย่างเรื่องนี้หรือไม่? เมื่อฉันลองแล้วพบข้อผิดพลาด?   -  person Jeremy Fisher    schedule 10.01.2018
comment
gist.github.com/psamsotha/6ac7816b4bf17eaebb87a876e7c730c7   -  person Paul Samsotha    schedule 10.01.2018
comment
ฉันคิดว่าฉันต้องผูก ServiceLocator ไม่เช่นนั้นฉันจะไม่ได้รับข้อผิดพลาดในการใช้งาน ซึ่งกลับมาที่จุดแรกของฉันว่าจะรับหรือสร้าง ServiceLocator ได้อย่างไร   -  person Jeremy Fisher    schedule 10.01.2018
comment
ใช้ Jersey เวอร์ชั่นไหนครับ?   -  person Paul Samsotha    schedule 10.01.2018
comment
ดูเหมือน Jersey 2.19 นะ   -  person Jeremy Fisher    schedule 10.01.2018
comment
ควรทำงาน. คุณทำการทดสอบของฉันแล้วหรือยัง?   -  person Paul Samsotha    schedule 10.01.2018
comment
ฉันดำเนินการเปลี่ยนแปลงของคุณใน AuthenticationDynamicFeature ของฉัน ฉันเพิ่ม ServiceLocator ในตัวสร้างของฉันที่มี @Inject อยู่แล้วและใช้ locator.inject(sentryAuthFilter) there. There's not really another place where I can inject it. I can't inject it in configure because I can't easily make a SentryAuthFilter` (มีข้อโต้แย้งที่ส่งผ่านไปยังตัวสร้างของมัน) ซึ่งฉันไม่คิดว่าควรสร้างอินสแตนซ์ใน AuthenticationDynamicFeature   -  person Jeremy Fisher    schedule 10.01.2018
comment
คุณจะทำเช่นนั้นได้อย่างไรเมื่อเป็นผู้ให้บริการและไม่ใช่ตัวกรองจริง เพียงทำด้วยวิธีแผนที่บนสตรีมของคุณ   -  person Paul Samsotha    schedule 10.01.2018
comment
งั้นแทนที่จะเป็น .map(javax.inject.Provider::get) ทำ .map(this.locator.inject(javax.inject.Provider)) เหรอ? ที่ล้มเหลวด้วย Object ไม่ใช่อินเทอร์เฟซที่ใช้งานได้   -  person Jeremy Fisher    schedule 10.01.2018
comment
1) รับตัวกรองจากผู้ให้บริการ 2) ฉีดตัวกรอง 3) คืนตัวกรอง   -  person Paul Samsotha    schedule 10.01.2018