我正在寻找一种在POJO /模型类中创建带有jersey / resteasy而没有注释的web服务的方法。我用jooq生成我的模型类,每次在数据库中进行更改时都会生成模型类。
我发现了与我的问题相关的两个主题:here和here但我想知道是否有另一个解决方案而不是使用另一个lib /实现。
任何提示? 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和我的蘑菇桌生成的蘑菇类/实体看起来像:
@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表示的注释),我将需要编辑AGAIN jooq类。
所以我正在寻找一种方法在另一个类/另一个文件中添加Mushroom生成的类的Resteasy注释(json表示)。
答案 0 :(得分:0)
我和泽西做过类似的事情。您可以使用mixin功能创建外部界面并使用jersey注册mixin。这就是我如何能够将序列化之类的东西添加到外部pojo中。
How can I tell jackson to ignore a property for which I don't have control over the source code?
顺便说一下,您仍然需要使用@Path
注释创建资源类。我不知道解决这个问题。我假设您正在尝试将序列化参数添加到pojo对象而不添加注释。在这种情况下,mixin可能是您最理想的解决方案。
答案 1 :(得分:0)
我只能通过jOOQ 3.2看到这些选项:
关于custom code sections的手册部分对此进行了部分记录。在您的情况下,您可能需要完全重写POJO的生成(或生成其他POJO)以使用JAXB或其他注释对其进行注释
如果您想完全控制每个JSON数据结构,从长远来看,这可能是更好的选择。 jOOQ的DefaultRecordMapper
(例如ResultQuery.fetchInto(Class)
使用的)可能仍然能够映射到它们
RecordMapperProvider
如果您的JSON数据结构与数据库模型大不相同,您可能需要考虑通过编写自己的RecordMapperProvider
来覆盖大多数jOOQ的默认行为
答案 2 :(得分:0)
第一句话:您应该始终将持久类与数据传输对象分开。这样可以使您的应用程序应用于任何数据库系统,而不会对您的Web服务合同产生任何影响。
第二条评论:拥有真正的DTO可以让您在这些DTO类上添加自己的注释,或者只是不添加注释,因为您可以通过指定Web服务的数据返回类型将对象自动转换为JSON格式。 / p>