簡體   English   中英

Jersey Inject Weld管理bean進入ConstraintValidator

[英]Jersey Inject Weld managed bean into ConstraintValidator

我一直在尋找幾個小時來找到我的問題的解決方案,但我無法讓它工作。 我想將我的Weld托管服務注入ConstraintValidator,該ConstraintValidator用於驗證發布到我的JAX-RS Rest-Service的User-Object。 一切都部署到glassfish 4.1服務器。

我有這樣的服務

@ApplicationScoped
public class UserService {

}

我想把它注入像這樣的ConstraintValidator

public class UniqueUserNameValidator implements ConstraintValidator<UniqueUserName, ApiUser> {

    @Inject
    private UserService service;

    @Override
    public void initialize(UniqueUserName constraintAnnotation) {
    }

    @Override
    public boolean isValid(ApiUser value, ConstraintValidatorContext context) {
        return service.getByUserName(value.getUserName()) == null;
    }

}

REST資源看起來像這樣

@Path("users")
@Produces(MediaType.APPLICATION_JSON)
public class UserResource {  

    @Inject
    UserService userService;

    @POST
    public Response createUser(@Valid ApiUser apiUser) {
        ApiRepresentation created = userService.create(apiUser);
        return Response.created(createURL(created)).build();
    }
}

當我發布一個json用戶對象時,我得到以下異常:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=UserService,parent=UniqueUserNameValidator,qualifiers={},position=-1,optional=false,self=false,unqualified=null,173822971)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)
at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:947)
at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:902)
at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:977)
at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:968)
at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:173)

我知道jersey使用hk2作為DI提供程序,而ConstraintValidator是使用InjectingConstraintValidatorFactory創建的,而InjectingConstraintValidatorFactory又使用ResourceContext。 由於HK2對我的WELD容器托管bean一無所知,因此在創建ConstraintValidator時無法注入正確的服務。

為了解決這個問題,我正在尋找

a)使用自定義ConstraintValidatorFactory提供JAX-RS(最好是純粹的JAX-RS方式而不依賴於jersey)來創建驗證器的方法。

或b)強制球衣使用WELD作為DI提供者或告訴hk2拾取所有容器管理的bean而不手動將每個bean添加到hk2的方法。 我不知道如何使用這里提出的橋梁。

我感謝任何幫助。

干杯

我還遇到了Jersey 2.25.x,Weld 2.4.x和Tomcat 8.x這個問題,並且沒有找到適合@Inject解決方案。

作為一種解決方法,我使用以下方式以編程方式查找bean實例:

SomeSortOfBean bean = CDI.current().select(SomeSortOfBean.class).get();

您是否有可能為項目更改基礎JAX-RS實施?

當我遇到同樣的問題時,我只是從Jersey切換到RestEasy(完全認證的JAX-RS實現)。 http://resteasy.jboss.org/

更改實現很簡單:只需通過您最喜歡的構建自動化工具(我使用gradle)包含dependy:

compile 'org.jboss.resteasy:resteasy-servlet-initializer:3.0.11.Final'

此外,要使CDI工作,請包括resteasy-cdi JAX-RS CDI橋:

compile 'org.jboss.resteasy:resteasy-cdi:3.0.11.

最后,如果您想要相同的JSON格式,請包含resteasy-jackson-provider:

compile 'org.jboss.resteasy:resteasy-jackson-provider:3.0.11.Final'

最后,切換到resteasy給我帶來的麻煩比嘗試實施Jersey修復要少得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM