簡體   English   中英

寧靜的Web服務,無注釋

[英]Restful webservices without annotations

我正在尋找一種創建帶有jersey / resteasy且沒有POJO / model類中的注釋的web服務的方法。 我用jooq生成模型類,並且每次在數據庫中進行更改時都會生成模型類。

我發現了兩個與我的問題有關的主題: 在這里這里,但是我想知道是否有另一個解決方案,而不是使用另一個庫/實現。

有小費嗎? TECHNIC? 理念?

非常感謝你!

編輯:我添加一些代碼。 我有一個名為“ 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.因為jooq類是每次我在蘑菇表我將丟失注釋(用於json表示的注釋),並且需要再次編輯jooq類。

所以我正在尋找一種在另一個類/另一個文件中添加Mushroom生成的類的Resteasy注釋(json表示形式)的方法。

我在澤西島做了類似的事情。 您可以使用mixin功能創建外部接口,並在jersey中注冊mixin。 這樣便可以解決將序列化之類的內容添加到外部pojo的問題。

如何告訴傑克遜忽略我無法控制源代碼的屬性?

順便說一句,您仍然需要使用@Path注釋創建資源類。 我不知道如何解決這個問題。 我假設您嘗試在不添加注釋的情況下將序列化參數添加到pojo對象。 在這種情況下,mixin可能是您最佳的解決方案。

我只能在jOOQ 3.2中看到這些選項:

1.編寫自己的代碼生成器

手冊的有關自定義代碼部分的部分對此進行了部分記錄 在您的情況下,您可能需要完全重寫POJO的生成(或生成其他POJO),以使用JAXB或其他注釋對其進行注釋。

2.手動編寫POJO,以對其進行更多控制

從長遠來看,如果您想完全控制每個JSON數據結構,這可能是一個更好的選擇。 jOOQ的DefaultRecordMapper (例如,由ResultQuery.fetchInto(Class)使用)可能仍然可以映射到它們

3.手動編寫POJO,並編寫自己的RecordMapperProvider

如果您的JSON數據結構與數據庫模型有很大不同,則可能需要考慮通過編寫自己的RecordMapperProvider來覆蓋jOOQ的大多數默認行為。

首先要說明的是:您應始終將持久類與數據傳輸對象分開。 這使您的應用程序可以應用到任何數據庫系統上,而不會影響Web服務合同。

第二點:真正的DTO使您可以在這些DTO類上添加自己的注釋,或者只是不添加注釋,因為可以通過指定Web服務的數據返回類型將對象自動轉換為JSON格式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM