ฉันยังใหม่กับ 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
ในนั้น
ขออภัยที่โพสต์ยาว แต่ฉันสับสนจริงๆ
authenticator
แต่ฉันจะได้request
หรือresponse
จากที่ไหน - person Jeremy Fisher   schedule 10.01.2018ServiceLocator
ฉีดแล้วลงทะเบียนเลยเหรอ? มันจะเติมค่าคำขอและการตอบสนองได้อย่างไร? ตัวกรองต้องการค่าเหล่านั้น ดังนั้นการแทรกตัวกรองจะทำให้ @Context ฉีด HTTPServletRequest และ HTTPServletResponse ได้อย่างไร - person Jeremy Fisher   schedule 10.01.2018List<AuthFilter> filters...
ทั้งหมดนั้นมีความสำคัญเนื่องจากรวบรวมตัวกรองต่างๆ ที่ระบุไว้สำหรับ API เฉพาะตามคำอธิบายประกอบDynamicAuthFilter
จำเป็นต่อการเรียกตัวกรองเหล่านั้น คุณกำลังบอกว่าวิธีconfigure
ของฉันควรเป็นบรรทัดList<AuthFilter> filters
เท่านั้น จากนั้นสร้างวัตถุ DynamicAuthFilter ที่ส่งผ่านตัวกรอง จากนั้นใช้ServiceLocator
เพื่อฉีดDynamicAuthFilter
- person Jeremy Fisher   schedule 10.01.2018AuthenticationDynamicFeature
ของฉัน ฉันเพิ่ม 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.map(javax.inject.Provider::get)
ทำ.map(this.locator.inject(javax.inject.Provider))
เหรอ? ที่ล้มเหลวด้วย Object ไม่ใช่อินเทอร์เฟซที่ใช้งานได้ - person Jeremy Fisher   schedule 10.01.2018