Json jax-rs方法参数作为cdibean

Json jax-rs方法参数作为cdibean,json,jax-rs,java-ee-6,cdi,bean-validation,Json,Jax Rs,Java Ee 6,Cdi,Bean Validation,我有如下简单的JAX-RS bean: @Path('/client') class ClientResource { @POST public Response post(Client client) { ... } } 客户端是从json响应体创建的。 有没有可能让客户机类成为CDI感知bean?我希望能够做到这样: class Client { @Inject private Validator validator;

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

@Path('/client')
class ClientResource {

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

}
客户端
是从json响应体创建的。 有没有可能让
客户机
类成为CDI感知bean?我希望能够做到这样:

class Client {

    @Inject
    private Validator validator;

    public String clientName;    

    public validate() {
       // use validator here
    }
}
默认情况下,我得到的是
validator
null,所以客户端似乎没有被管理

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

编辑


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

这应该可以很好地工作。可能是bean val不可用。尝试创建一个制作人或注入其他内容

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

如果您使用的是JAXB,那么它的支持。它可以调用被解组的对象上的方法,或者更好的是,调用单独的方法。您可以注册一个侦听器,该侦听器具有对CDI的引用(通过简单的
@Inject
,或通过JNDI在
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;
    }

}
公共类注入器{
专用最终BeanManager BeanManager;
私人最终注入目标注入目标;
私家菜豆;
公共注入器(BeanManager BeanManager,类别cl){
this.beanManager=beanManager;
injectionTarget=beanManager.createInjectionTarget(beanManager.createAnnotatedType(cl));
bean=resolve(beanManager.getBeans(cl));
}

private Bean resolve(设置)不管我注入什么,计算结果都是
null
。我怀疑这个
客户端
实例是通过新的绕过CDI生命周期创建的,我不知道如何避免它。是的,你可能是对的。这可能在Java EE 7中得到了修复,但我不确定。当然,现在这对你没有帮助。