0

我有如下简单的 JAX-RS bean:

@Path('/client')
class ClientResource {

    @POST
    public Response post(Client client) {
        ...
    }

}

Client正在从 json 响应正文创建。是否可以让Client类成为 CDI 感知 bean?我希望能够做这样的事情:

class Client {

    @Inject
    private Validator validator;

    public String clientName;    

    public validate() {
       // use validator here
    }
}

默认情况下,我得到validator空值,所以似乎客户端没有被管理。

我使用 JBoss 和 RESTEasy 作为 Jax-RS 实现。

编辑

我想我可以提供来自 JSON 的自定义映射器,但那时它似乎有很多样板代码。

4

2 回答 2

0

那应该工作得很好。bean val 可能不可用。尝试创建生产者或注入其他东西。

于 2013-01-16T14:04:47.340 回答
0

您是否使用 JAXB 进行解组?我不熟悉 RESTEasy,虽然我看到它可以使用 JAXB,但我不知道这是否是唯一的选择。

如果您使用的是 JAXB,那么它Unmarshaller支持Unmarshal Event Callbacks。它可以调用正在解组的对象上的方法,或者更好的是,调用单独的事件侦听器。您可以注册一个侦听器,该侦听器具有对 CDI 的引用BeanManager(使用简单@Inject的 或通过 JNDI at 获得java:comp/BeanManager),并使用它来注入新解组的对象。

我绝不是 CDI 专家,但实验表明这似乎注入了一个已经创建的对象:

public class Injector<T> {

    private final BeanManager beanManager;
    private final InjectionTarget<T> injectionTarget;
    private final Bean<T> bean;

    public Injector(BeanManager beanManager, Class<T> cl) {
        this.beanManager = beanManager;
        injectionTarget = beanManager.createInjectionTarget(beanManager.createAnnotatedType(cl));
        bean = resolve(beanManager.getBeans(cl));
    }

    private Bean<T> resolve(Set<Bean<?>> beans) {
        @SuppressWarnings("unchecked")
        Bean<T> bean = (Bean<T>) beanManager.resolve(beans);
        return bean;
    }

    public CreationalContext<T> inject(T obj) {
        CreationalContext<T> creationalContext = beanManager.createCreationalContext(bean);
        injectionTarget.inject(obj, creationalContext);
        return creationalContext;
    }

}

该代码采用某个类的现有实例并将依赖项注入其中。这是对 CDI 的有点不规则的使用,但它似乎有效(此外,我相信它是完全有效和支持的)。

请注意,调用代码需要保留返回的,并在对象完成后CreationalContext调用其方法。release

于 2013-01-21T00:56:10.850 回答