【问题标题】:Restful webservices without annotations没有注释的 Restful Web 服务
【发布时间】:2013-11-02 16:19:30
【问题描述】:

我正在寻找一种在 POJO/model 类中没有注释的情况下使用 jersey/resteasy 创建 web 服务的方法。我使用jooq 生成模型类,并且每次在数据库中进行更改时都会生成模型类。

我发现了两个与我的问题相关的主题:herehere,但我想知道除了使用另一个库/实现之外是否还有其他解决方案。

有什么建议吗?技术?想法?

非常感谢!

编辑: 我添加了一些代码。我有一个名为“Mushroom”的模型类,它由 3 个字段组成:mushroom_id、title、description。

我想要一个如下所示的 JSON 表示:

{
    mushroom: {
        mushroom_id: 12,
        title: "pied de mouton",
        description: "très bon champignon!"
    }
}

为此,使用 Resteasy,我需要一个带有以下注释的蘑菇类:

@XmlRootElement(name = "mushroom")
public class Mushroom {
    private Integer mushroomId;
    private String  title;
    private String  description

    // for each field I need a getter
    // with the XmlElement annotations.
    // for 'description' for instance:
    @XmlElement
public String getDescription() {
    return description;
}
}

但是,jooq 用我的表 Mushroom 生成的 Mushroom 类/实体看起来像:

@javax.annotation.Generated(value    = { "http://www.jooq.org", "3.2.0" },
                        comments = "This class is generated by jOOQ")
@java.lang.SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Mushrooms extends org.jooq.impl.TableImpl<com.spanier.db.tables.records.MushroomsRecord> {

private static final long serialVersionUID = -539518621;

/**
 * The singleton instance of <code>public.mushrooms</code>
 */
public static final com.spanier.db.tables.Mushrooms MUSHROOMS = new com.spanier.db.tables.Mushrooms();

/**
 * The class holding records for this type
 */
@Override
public java.lang.Class<com.spanier.db.tables.records.MushroomsRecord> getRecordType() {
    return com.spanier.db.tables.records.MushroomsRecord.class;
}

/**
 * The column <code>public.mushrooms.mushrooms_id</code>. 
 */
public final org.jooq.TableField<com.spanier.db.tables.records.MushroomsRecord, java.lang.Integer> MUSHROOMS_ID = createField("mushrooms_id", org.jooq.impl.SQLDataType.INTEGER.nullable(false).defaulted(true), this);

/**
 * The column <code>public.mushrooms.name</code>. 
 */
public final org.jooq.TableField<com.spanier.db.tables.records.MushroomsRecord, java.lang.String> NAME = createField("name", org.jooq.impl.SQLDataType.CHAR.length(50).nullable(false), this);

/**
 * The column <code>public.mushrooms.description</code>. 
 */
public final org.jooq.TableField<com.spanier.db.tables.records.MushroomsRecord, java.lang.String> DESCRIPTION = createField("description", org.jooq.impl.SQLDataType.VARCHAR, this);

/**
 * Create a <code>public.mushrooms</code> table reference
 */
public Mushrooms() {
    super("mushrooms", com.spanier.db.Public.PUBLIC);
}

/**
 * Create an aliased <code>public.mushrooms</code> table reference
 */
public Mushrooms(java.lang.String alias) {
    super(alias, com.spanier.db.Public.PUBLIC, com.spanier.db.tables.Mushrooms.MUSHROOMS);
}

/**
 * {@inheritDoc}
 */
@Override
public org.jooq.Identity<com.spanier.db.tables.records.MushroomsRecord, java.lang.Integer> getIdentity() {
    return com.spanier.db.Keys.IDENTITY_MUSHROOMS;
}

/**
 * {@inheritDoc}
 */
@Override
public org.jooq.UniqueKey<com.spanier.db.tables.records.MushroomsRecord> getPrimaryKey() {
    return com.spanier.db.Keys.MUSHROOMS_PKEY;
}

/**
 * {@inheritDoc}
 */
@Override
public java.util.List<org.jooq.UniqueKey<com.spanier.db.tables.records.MushroomsRecord>> getKeys() {
    return java.util.Arrays.<org.jooq.UniqueKey<com.spanier.db.tables.records.MushroomsRecord>>asList(com.spanier.db.Keys.MUSHROOMS_PKEY);
}

/**
 * {@inheritDoc}
 */
@Override
public com.spanier.db.tables.Mushrooms as(java.lang.String alias) {
    return new com.spanier.db.tables.Mushrooms(alias);
}
}

如您所见,jooq 生成的类是: 1.已经充满了注释,如果我添加新的注释,那么容易“阅读”类会很复杂 2. 因为每次我在 Mushroom 表中进行修改时都会生成 jooq 类,所以我会丢失我的注释(json 表示的注释),我需要再次编辑 jooq 类。

所以我正在寻找一种方法将蘑菇生成的类的 Resteasy 注释(json 表示)添加到另一个类/另一个文件中。

【问题讨论】:

  • 您的问题究竟是什么
  • 嗨 Lukas,我的问题是我不想直接向类添加注释,因为每次在数据库中进行更改时都会生成类。对于 jooq,我显然可以避免这种行为,但我认为单独的“resteasy 注释”在团队项目中更容易管理。而且jooq生成的类也充满了注解,阅读起来很复杂。
  • 杰里米,我认为这个问题需要一些代码,显示你有什么,以及你想去哪里。在这个问题的现阶段很难帮助你......换句话说,读你的想法有点困难:-)
  • 我在第一篇文章中添加了代码。谢谢!

标签: java sql jersey resteasy jooq


【解决方案1】:

第一句话:您应该始终将持久类与数据传输对象分开。这使您的应用程序能够应用于任何数据库系统,而不会影响您的 Web 服务合同。

第二点:拥有真正的 DTO 可以让您在这些 DTO 类上添加自己的注释,或者不添加注释,因为您的对象可以通过指定 Web 服务的数据返回类型自动转换为 JSON 格式。

【讨论】:

  • 谢谢你的回答,这实际上是最好的方法。
【解决方案2】:

我在泽西岛做过类似的事情。您可以使用 mixin 功能创建外部接口并将 mixin 注册到 jersey。这就是我能够解决向外部 pojo 添加诸如序列化之类的事情的方法。

How can I tell jackson to ignore a property for which I don't have control over the source code?

顺便说一句,您仍然需要使用 @Path 注释创建资源类。我不知道解决这个问题的方法。我假设您正在尝试将序列化参数添加到 pojo 对象而不添加注释。在这种情况下,mixin 可能是您的最佳解决方案。

【讨论】:

    【解决方案3】:

    我只能通过jOOQ 3.2 看到这些选项:

    1。编写自己的代码生成器

    这部分记录在手册中关于custom code sections 的部分。在您的情况下,您可能需要完全重写 POJO 的生成(或生成额外的 POJO)以使用 JAXB 或其他注释对其进行注释

    2。手动编写 POJO 以更好地控制它们

    如果您想完全控制每个 JSON 数据结构,从长远来看,这可能是一个更好的选择。 jOOQ 的 DefaultRecordMapper(例如 ResultQuery.fetchInto(Class) 使用的)可能仍然能够映射到它们上

    3。手动编写 POJO 并编写自己的 RecordMapperProvider

    如果您的 JSON 数据结构与您的数据库模型有很大不同,您可能需要考虑通过编写自己的 RecordMapperProvider 来覆盖大部分 jOOQ 的默认行为@

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多