REST Jersey 服务器 JAX-RS 500 内部服务器错误
REST Jersey server JAX-RS 500 Internal Server Error
我正在调用此方法并从中获得 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 之外的任何类型的错误消息。我已经尝试设置一个异常映射器,正如其他一些帖子提到的那样,但这也没有得到任何结果。
IllegalAnnotationException: Class has two properties of the same name "list"
看看你的两个模型 类 XmlMessageBean
和 ResponseList
。你看到有什么不同吗?主要区别(以及错误原因)是 @XmlAccessorType(XmlAccessType.FIELD)
注释(或缺少注释)。默认情况下,JAXB 将查找 public 属性 (JavaBean getters/setters)。这就是一个 属性。但是随后您通过在该字段上使用 @XmlElement
注释来定义另一个 属性。它适用于 XmlMessageBean
的原因是它通过将其更改为 XmlAccessType.FIELD
来覆盖默认的 public 属性 查找
所以你可以简单地用 @XmlAccessorType(XmlAccessType.FIELD)
注释 ResponseList
并且它应该工作。您也可以简单地去掉所有 @XmlElement
注释,去掉 @XmlAccessorType(XmlAccessType.FIELD)
,它仍然可以工作,因为它会查找 JavaBean 属性。通常,对我来说,我只在需要更改 属性 的名称时才使用 @XmlElement
注释,并将其放在 getter 上,例如
private String messageBody;
@XmlElement(name = "body")
public String getMessageBody(){
return messageBody;l
}
除此之外,我通常会省略注释,还有 @XmlAccessorType
注释,让它解析为默认行为。
我正在调用此方法并从中获得 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 之外的任何类型的错误消息。我已经尝试设置一个异常映射器,正如其他一些帖子提到的那样,但这也没有得到任何结果。
IllegalAnnotationException: Class has two properties of the same name "list"
看看你的两个模型 类 XmlMessageBean
和 ResponseList
。你看到有什么不同吗?主要区别(以及错误原因)是 @XmlAccessorType(XmlAccessType.FIELD)
注释(或缺少注释)。默认情况下,JAXB 将查找 public 属性 (JavaBean getters/setters)。这就是一个 属性。但是随后您通过在该字段上使用 @XmlElement
注释来定义另一个 属性。它适用于 XmlMessageBean
的原因是它通过将其更改为 XmlAccessType.FIELD
所以你可以简单地用 @XmlAccessorType(XmlAccessType.FIELD)
注释 ResponseList
并且它应该工作。您也可以简单地去掉所有 @XmlElement
注释,去掉 @XmlAccessorType(XmlAccessType.FIELD)
,它仍然可以工作,因为它会查找 JavaBean 属性。通常,对我来说,我只在需要更改 属性 的名称时才使用 @XmlElement
注释,并将其放在 getter 上,例如
private String messageBody;
@XmlElement(name = "body")
public String getMessageBody(){
return messageBody;l
}
除此之外,我通常会省略注释,还有 @XmlAccessorType
注释,让它解析为默认行为。