我正在调用这种方法并从中获得500。
在调试器中,我能够一直走到最后的return语句。没问题,在调用Response.build()后,r按预期填充,状态显示200 OK。但这并不是最终会产生的。我甚至告诉eclipse打破任何异常。
@GET
@Path("/getAllAppMessagesAsXML")
@Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML})
public Response getAllAppMessagesXML(@QueryParam("applicationId") String applicationId){
ResponseList list = new ResponseList();
ArrayList<XmlMessageBean> xmlmessages = new ArrayList<>();
try {
List<AppMessage> messages = //Gets from a database
for(AppMessage m : messages){
XmlMessageBean xm = new XmlMessageBean();
xm.setId(m.getId());
xm.setApplicationId(m.getApplicationId());
xm.setMessageBody(m.getMessageBody());
xm.setMessageLevel(m.getMessageLevel());
xm.setMessageTitle(m.getMessageTitle());
xmlmessages.add(xm);
}
} catch (Exception e) {
logger.error("ERROR Failed to save Message AppMessageService.saveAppMessage()", e);
Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
list.setList(xmlmessages);
Response r = null;
try{
r = Response.status(Response.Status.OK).entity(list).build();
}catch(Exception e){
e.printStackTrace();
}
return r;
}
XmlMessageBean.java
@XmlRootElement(name="AppMessage")
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlMessageBean {
@XmlElement
private Long id;
@XmlElement
private String applicationId;
@XmlElement
private String messageTitle;
@XmlElement
private String messageBody;
@XmlElement
private String messageLevel;
public XmlMessageBean(){
}
//getters and setters
}
ResponseList.java
@XmlRootElement(name = "ResponseList")
public class ResponseList {
public ResponseList(){
}
@XmlElement(name="list")
private List<XmlMessageBean> list;
public List<XmlMessageBean> getList() {
return list;
}
public void setList(List<XmlMessageBean> list) {
this.list = list;
}
}
我已经在jersey.servlet.ServletContainer中运行了这一切 我很难过。我不知道如何让它产生除通用500之外的任何类型的错误消息。我已经尝试设置一个异常映射器,因为其他一些帖子已经提到但是这也没有提取任何东西。
答案 0 :(得分:0)
IllegalAnnotationException: Class has two properties of the same name "list"
查看您的两个模型类XmlMessageBean
和ResponseList
。你觉得有什么不同吗?主要区别(以及错误的原因)是@XmlAccessorType(XmlAccessType.FIELD)
注释(或缺少注释)。默认情况下,JAXB将查找公共属性(JavaBean getters / setters)。这是一个属性。但是,您可以通过在字段上使用@XmlElement
注释来定义另一个属性。它适用于XmlMessageBean
的原因是它通过将其更改为XmlAccessType.FIELD
来覆盖默认的公共属性查找
因此,您只需使用ResponseList
注释@XmlAccessorType(XmlAccessType.FIELD)
,它就可以正常工作。您还可以简单地删除所有@XmlElement
注释,并删除@XmlAccessorType(XmlAccessType.FIELD)
,它仍然可以工作,因为它将查找JavaBean属性。一般来说,对我来说,当我需要更改属性的名称时,我只使用@XmlElement
注释,例如,将它放在getter上。
private String messageBody;
@XmlElement(name = "body")
public String getMessageBody(){
return messageBody;l
}
除此之外,我通常会省略注释,以及@XmlAccessorType
注释,让它解析为默认行为。