Jaxb 如何在glassfish v4 MOXy Provider和xFF1F中指定和组织OXM_元数据_源;

Jaxb 如何在glassfish v4 MOXy Provider和xFF1F中指定和组织OXM_元数据_源;,jaxb,jax-rs,moxy,glassfish-4,Jaxb,Jax Rs,Moxy,Glassfish 4,我是Glassfish和MOXy的粉丝,MOXy被捆绑到Glassfish v4中对我来说是个好消息 我在互联网上阅读并尝试了一些MOXy示例,我喜欢动态OXM_META_DATA_源代码部分,因为在提供RESTful服务的同时,“客户端透视图”比域类更灵活 问题是: 不同的RESTful服务可以从相同的域类中拥有不同的视图,在我的工作中这是非常常见的情况。因此,每个服务都可能有大量绑定OXM元数据文件。正如我们所知,单个OXM元数据文件只能对应于单个java包。因此,将有更多的OXM元数据文件

我是Glassfish和MOXy的粉丝,MOXy被捆绑到Glassfish v4中对我来说是个好消息

我在互联网上阅读并尝试了一些MOXy示例,我喜欢动态OXM_META_DATA_源代码部分,因为在提供RESTful服务的同时,“客户端透视图”比域类更灵活

问题是:

不同的RESTful服务可以从相同的域类中拥有不同的视图,在我的工作中这是非常常见的情况。因此,每个服务都可能有大量绑定OXM元数据文件。正如我们所知,单个OXM元数据文件只能对应于单个java包。因此,将有更多的OXM元数据文件需要维护


回到JAX-RS,是否有任何框架可以设计模式或最佳实践来完成OXM元数据文件集与服务本身之间的映射?

您可以尝试Jersey 2.3中引入的名为实体过滤的新功能。即使实体筛选不是基于
OXM\u META\u DATA\u SOURCE
的,您也可以通过它实现您的目标:

假设您有以下域类(注释是自定义实体筛选注释):

现在,我们有两个关于域类(通过注释)和资源类的详细视图。如果使用以下内容注释
getProject
资源方法:

  • @ProjectDetailedView-返回的实体将包含来自Project的
    id
    名称
    说明
    和任务列表
  • @ProjectAnotherDetailedView-返回的实体将包含来自Project的
    id
    名称
    说明
    用户列表
如果不注释资源方法,则生成的实体将只包含:
id
name
description

您可以在中找到有关的更多信息,也可以直接在我们的示例中尝试:

注1:实体过滤目前仅适用于JSON媒体类型(通过MOXy)。计划将来添加对其他媒体类型/提供商的支持


注2:球衣2.3未集成到GF 4.0的任何(升级)版本中。下一个应该成为GF 4.0一部分的泽西版本是2.4。我们计划在未来几周发布2.4。

似乎更好、更简单的解决方案是使用Transfer Object Java EE核心模式来解决特定于用例的域类视图,然后使用MOXy将这些TOs绑定到带有TOJSON OXM_元数据的JSON文本中。至少JAX-RS提供了一些扩展点,例如实体提供程序:MessageBodyReader、MessageBodyWriter或上下文提供程序:ContextResolver,所有这些扩展点都是为了映射域或与这些提供程序一起分类而设计的。我已经请Jersey团队的人发布了对您问题的答案。JavaOne上提供了一个实体过滤功能,它利用了MOXy的对象图(请参阅:),可以在这里应用。您可以使用以下链接查看JAX-RS和JSON绑定演讲的幻灯片:
public class Project {

    private Long id;

    private String name;

    private String description;

    @ProjectDetailedView
    private List<Task> tasks;

    @ProjectAnotherDetailedView
    private List<User> users;

    // ...
}
@Path("projects")
@Produces("application/json")
public class ProjectsResource {

    @GET
    @Path("{id}")
    public Project getProject(@PathParam("id") final Long id) {
        return ...;
    }

    // ...
}