REST Jersey服务器JAX-RS 500内部服务器错误

时间:2015-06-22 20:24:21

标签: java rest jersey jax-rs

我正在调用这种方法并从中获得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之外的任何类型的错误消息。我已经尝试设置一个异常映射器,因为其他一些帖子已经提到但是这也没有提取任何东西。

1 个答案:

答案 0 :(得分:0)

  

IllegalAnnotationException: Class has two properties of the same name "list"

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