Json jax-rs方法参数作为cdibean
我有如下简单的JAX-RS bean: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;
@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中得到了修复,但我不确定。当然,现在这对你没有帮助。