首页 > 解决方案 > 瞬态 json jax-rs

问题描述

我正在学习创建一个休息 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"
}

问题是当header 是时生成的响应MessageResource.allMessages()包含一个字段,但当header 是or时不显示。我已经尝试添加和,但它仍然出现。有关如何从 json 响应中删除密钥的任何建议?validToAddAcceptapplication/jsonAcceptapplication/xmltext/xml@XmlTransient@JsonbTransientMessage.isValidToAdd()validToAdd

标签: javarestjakarta-eejax-rs

解决方案


最好将消息验证器分离到另一个类中。但是如果你想把它放在消息类中,你可以考虑为它归档,例如public boolean validToAdd;

现在,如果您想 jsonb 忽略它,您可以将其标记为,@JsonbTransient public boolean validToAdd;但 xml 绑定不会忽略它,您也可以添加@XmlTransient。或使 isValidToAdd 成为私有方法,因为它只能从类内部调用。

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


推荐阅读