我正在学习创建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/xml
或text/xml
。我尝试将@XmlTransient
和@JsonbTransient
添加到Message.isValidToAdd()
,但它仍然显示。关于如何从json响应中删除validToAdd
键的任何建议?
答案 0 :(得分:0)
最好将消息验证器分成另一个类。
但是如果您希望将其包含在消息类中,则可以考虑将其归档,例如public boolean validToAdd;
现在,如果您想jsonb忽略它,可以将其标记为@JsonbTransient public boolean validToAdd;
,但是xml绑定不会忽略它,您也可以添加@XmlTransient
。
要么
可以通过仅在类内部调用isValidToAdd一个私有方法。
还有另一种方法,通过使用jsonb并为其创建自定义设置(JsonbConfig)。 最好将messagevalidator分离为一个类