Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@InjectParam注释将XML或JSON解组到jersey中的guice注入对象_Java_Jersey_Guice - Fatal编程技术网

Java 使用@InjectParam注释将XML或JSON解组到jersey中的guice注入对象

Java 使用@InjectParam注释将XML或JSON解组到jersey中的guice注入对象,java,jersey,guice,Java,Jersey,Guice,我遇到了一个问题,XML数据被正确地解组。我正在使用guice和jersey的技术。奇怪的事 当我尝试使用JAXB手动解组时,一切正常: StringBuilder xml = new StringBuilder(); xml.append("<role>"); xml.append(" <name><values><value>Administrator</value><value l=\"en\">Administra

我遇到了一个问题,XML数据被正确地解组。我正在使用guice和jersey的技术。奇怪的事 当我尝试使用JAXB手动解组时,一切正常:

StringBuilder xml = new StringBuilder();
xml.append("<role>");
xml.append("  <name><values><value>Administrator</value><value l=\"en\">Administrator</value></values></name>");
xml.append("  <permissions>");
xml.append("    <permission>READ_XX</permission>");
xml.append("    <permission>WRITE_XX</permission>");
xml.append("  </permissions>");
xml.append("</role>");

JAXBContext jaxbContext = JAXBContext.newInstance(DefaultRole.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Object o = jaxbUnmarshaller.unmarshal(new StringReader(xml.toString()));
对象已实例化,但未填充: DefaultRole[id=null,name=null,权限=[]

奇怪的是,当我用默认类替换接口参数(@InjectParam Role)时:

@POST
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public JSONObject processLogin(DefaultRole role) throws JSONException
{
  System.out.println(role);

  return null;
}
它起作用了,我再次正确地填充了我的对象

在使用接口向对象注入guice时,我需要做什么才能正确填充对象

我的DefaultRole类如下所示:

@XmlRootElement(name = "role")
@XmlAccessorType(XmlAccessType.FIELD)
public class DefaultRole implements Role
{
  private Id id = null;

  @XmlJavaTypeAdapter(ContextObjectAdapter.class)
  private ContextObject<String> name = null;

  @XmlElementWrapper(name = "permissions")
  @XmlElement(name = "permission")
  private List<String> permissions = Lists.newArrayList();

  @Inject
  private DefaultRole()
  {
  }
  [...]
@XmlRootElement(name=“role”)
@XmlAccessorType(XmlAccessType.FIELD)
公共类DefaultRole实现角色
{
私有Id=null;
@XmlJavaTypeAdapter(ContextObjectAdapter.class)
私有ContextObject name=null;
@XmlElementWrapper(name=“权限”)
@xmlement(name=“权限”)
私有列表权限=Lists.newArrayList();
@注入
私有DefaultRole()
{
}
[...]
我曾尝试向接口添加JAXB注释,但也没有任何帮助。请有人解释一下。 我已经花了几个小时试图让它现在没有任何运气

在此方面的任何帮助都将不胜感激。提前感谢, 迈克尔

对web.xml问题的回答: 实际上,我并不是通过WEB-INF执行标准路径,但这是我注册jersey组件的代码(当然,如果您仍然希望看到我的WEB.xml,我很乐意提供它):

Injector Injector=ModuleInjector.get().createChildInjector(新JerseyServletModule()
{
@凌驾
受保护的void configureServlets()
{
绑定(GuiceContainer.class);
Set>foundClasses2=Reflect.getReflections().getTypesAnnotatedWith(Provider.class,false);

Set当我在泽西岛邮件列表中收到回复说泽西岛不支持guice后,我进一步挖掘,试图找到一个解决方案。下面是消息:

“Jersey 2.0不支持Guice。请参阅”。 ()

为了完整起见,我也将在这里发布解决方案。我提出的解决方案可能不是适用于所有人的通用解决方案,但如果满足以下条件,可能会提供一些想法或帮助:

  • 所有要注入的对象都用类级注释“标记”
  • 所有要注入的对象都实现了一些接口(尽管它可以在不指定对象的情况下工作?)
  • 您可以创建自己的自定义参数注释
  • 在我的特殊情况下,我的所有bean都用@Model注释标记,并实现我的“Model”接口。其他类,如存储库或服务,无论如何都可以通过guice正常注入jersey资源。我遇到的问题只是@InjectParam注释

    我想这一切的神奇之处主要在于:

        model = request.getEntity(model.getClass());" 
    
    它神奇地用反序列化的内容(无论是JSON还是XML)填充GUI注入对象。我很惊讶,在使用@InjectParam时,内置解决方案不会出现这种情况,因为毕竟,实际的注入不是问题——只是没有填充对象

    我是这样解决的:

  • 创建了一个名为“ModelParam”的注释:

    @Target({ PARAMETER, METHOD, FIELD })
    @Retention(RUNTIME)
    @Documented
    public @interface ModelParam
    {
    }
    
  • 将我的资源“RoleRestWS”中的“InjectParam”注释替换为新的“ModelParam”注释:

    @POST
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Role createRole(@ModelParam Role role) throws JSONException
    {
      return userService.createRole(role);
    }
    
    @Provider
    @Singleton
    public class ModelInjectableProvider extends AbstractHttpContextInjectable<Model> implements InjectableProvider<ModelParam, Type>
    {
        private final Type type;
    
        public ModelInjectableProvider()
        {
            type = null;
        }
    
        public ModelInjectableProvider(Type type)
        {
            this.type = type;
        }
    
        @Override
        public ComponentScope getScope()
        {
            return ComponentScope.Undefined;
        }
    
        @Override
        public Injectable<Model> getInjectable(ComponentContext ic, ModelParam mp, Type type)
        {
            if (type instanceof Class && Model.class.isAssignableFrom((Class<?>) type))
            {
                return new ModelInjectableProvider(type);
            }
    
            return null;
        }
    
        @Override
        public Model getValue(HttpContext ctx)
        {
            if (type instanceof Class && Model.class.isAssignableFrom((Class<?>) type))
            {
                HttpRequestContext request = ctx.getRequest();
    
                Model model = null;
    
                if (HttpMethod.POST.equals(request.getMethod()) || HttpMethod.PUT.equals(request.getMethod()))
                {
                    model = (Model) MyGuiceInjector.inject((Class<?>) type);
    
                    if (model != null)
                        model = request.getEntity(model.getClass());
                }
    
                return model;
            }
    
            return null;
        }
    }
    
  • 为新的“ModelParam”批注创建了一个InjectableProvider:

    @POST
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Role createRole(@ModelParam Role role) throws JSONException
    {
      return userService.createRole(role);
    }
    
    @Provider
    @Singleton
    public class ModelInjectableProvider extends AbstractHttpContextInjectable<Model> implements InjectableProvider<ModelParam, Type>
    {
        private final Type type;
    
        public ModelInjectableProvider()
        {
            type = null;
        }
    
        public ModelInjectableProvider(Type type)
        {
            this.type = type;
        }
    
        @Override
        public ComponentScope getScope()
        {
            return ComponentScope.Undefined;
        }
    
        @Override
        public Injectable<Model> getInjectable(ComponentContext ic, ModelParam mp, Type type)
        {
            if (type instanceof Class && Model.class.isAssignableFrom((Class<?>) type))
            {
                return new ModelInjectableProvider(type);
            }
    
            return null;
        }
    
        @Override
        public Model getValue(HttpContext ctx)
        {
            if (type instanceof Class && Model.class.isAssignableFrom((Class<?>) type))
            {
                HttpRequestContext request = ctx.getRequest();
    
                Model model = null;
    
                if (HttpMethod.POST.equals(request.getMethod()) || HttpMethod.PUT.equals(request.getMethod()))
                {
                    model = (Model) MyGuiceInjector.inject((Class<?>) type);
    
                    if (model != null)
                        model = request.getEntity(model.getClass());
                }
    
                return model;
            }
    
            return null;
        }
    }
    
    @Provider
    @独生子女
    公共类ModelInjectableProvider扩展AbstractHttpContextInjectableImplements InjectableProvider
    {
    私有最终类型;
    公共ModelInjectableProvider()
    {
    type=null;
    }
    公共ModelInjectableProvider(类型)
    {
    this.type=type;
    }
    @凌驾
    公共组件范围getScope()
    {
    返回ComponentScope。未定义;
    }
    @凌驾
    公共可注入getInjectable(ComponentContext ic,ModelParam mp,类型)
    {
    if(类型instanceof Class&&Model.Class.isAssignableFrom((类)类型))
    {
    返回新的ModelInjectableProvider(类型);
    }
    返回null;
    }
    @凌驾
    公共模型getValue(HttpContext ctx)
    {
    if(类型instanceof Class&&Model.Class.isAssignableFrom((类)类型))
    {
    HttpRequestContext请求=ctx.getRequest();
    模型=空;
    if(HttpMethod.POST.equals(request.getMethod())| | HttpMethod.PUT.equals(request.getMethod())
    {
    model=(model)MyGuiceInjector.inject((Class)类型);
    如果(型号!=null)
    model=request.getEntity(model.getClass());
    }
    收益模型;
    }
    返回null;
    }
    }
    
  • 希望这能帮助有类似问题的人

    致以最良好的祝愿,
    Michael

    你的
    web.xml
    看起来像什么?嗨,我会通过编辑我的问题来回答,这样它就格式化了。
    @Provider
    @Singleton
    public class ModelInjectableProvider extends AbstractHttpContextInjectable<Model> implements InjectableProvider<ModelParam, Type>
    {
        private final Type type;
    
        public ModelInjectableProvider()
        {
            type = null;
        }
    
        public ModelInjectableProvider(Type type)
        {
            this.type = type;
        }
    
        @Override
        public ComponentScope getScope()
        {
            return ComponentScope.Undefined;
        }
    
        @Override
        public Injectable<Model> getInjectable(ComponentContext ic, ModelParam mp, Type type)
        {
            if (type instanceof Class && Model.class.isAssignableFrom((Class<?>) type))
            {
                return new ModelInjectableProvider(type);
            }
    
            return null;
        }
    
        @Override
        public Model getValue(HttpContext ctx)
        {
            if (type instanceof Class && Model.class.isAssignableFrom((Class<?>) type))
            {
                HttpRequestContext request = ctx.getRequest();
    
                Model model = null;
    
                if (HttpMethod.POST.equals(request.getMethod()) || HttpMethod.PUT.equals(request.getMethod()))
                {
                    model = (Model) MyGuiceInjector.inject((Class<?>) type);
    
                    if (model != null)
                        model = request.getEntity(model.getClass());
                }
    
                return model;
            }
    
            return null;
        }
    }