瞬态JSON JAX-RS

时间:2019-03-22 13:49:59

标签: java rest java-ee jax-rs

我正在学习创建rest api。这是我的MessageResource课:

@Path("/message")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public class MessageResource {

    private Map<Integer, Message> messages = Database.getMessages();

    @GET
    @Path("/all")
    public List<Message> allMessages() {
        return new ArrayList<Message>(messages.values());
    }

    //... some other stuff
}

Message类:

@XmlRootElement
public class Message {

    private Integer id;
    private String message;
    private String author;

    public Message() {}

    public Message(Integer id, String message, String author) {
        this.id = id;
        this.message = message;
        this.author = author;
    }

    public boolean isValidToAdd() {
        if(Database.getMessages().containsKey(id) || id < 0) return false;
        if(message.isEmpty()) return false;
        if(author.isEmpty()) return false;
        return true;
    }

    //getters and setters for "id", "message" and "author"
}

问题在于,当MessageResource.allMessages()标头为validToAdd时,Accept生成的响应包含一个字段application/json,但是当Accept标头为application/xmltext/xml。我尝试将@XmlTransient@JsonbTransient添加到Message.isValidToAdd(),但它仍然显示。关于如何从json响应中删除validToAdd键的任何建议?

1 个答案:

答案 0 :(得分:0)

最好将消息验证器分成另一个类。 但是如果您希望将其包含在消息类中,则可以考虑将其归档,例如public boolean validToAdd;

现在,如果您想jsonb忽略它,可以将其标记为@JsonbTransient public boolean validToAdd;,但是xml绑定不会忽略它,您也可以添加@XmlTransient。 要么 可以通过仅在类内部调用isValidToAdd一个私有方法。

还有另一种方法,通过使用jsonb并为其创建自定义设置(JsonbConfig)。 最好将messagevalidator分离为一个类