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"

看看你的两个模型 类 XmlMessageBeanResponseList。你看到有什么不同吗?主要区别(以及错误原因)是 @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 注释,让它解析为默认行为。