【问题标题】:REST Jersey server JAX-RS 500 Internal Server ErrorREST Jersey 服务器 JAX-RS 500 内部服务器错误
【发布时间】:2015-06-22 20:24:21
【问题描述】:

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

【问题讨论】:

  • 您是否为 Jersey 和您的 servlet 容器启用了日志记录?
  • 我有。日志也是无声的。
  • 你做过简单的 hello world 往返来验证网络、防火墙等吗?
  • 我正在做一些潜水,看到 IllegalAnnotationException:类有两个同名的属性“列表”也许我没有正确配置异常映射器。我想我不必为了得到那个而努力工作。

标签: java rest jersey jax-rs


【解决方案1】:

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

查看您的两个模型类XmlMessageBeanResponseList。你看有什么不同吗?主要区别(以及错误的原因)是 @XmlAccessorType(XmlAccessType.FIELD) 注释(或缺少注释)。默认情况下,JAXB 将查找公共属性(JavaBean getter/setter)。所以这是一个属性。但随后您通过在该字段上使用 @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 注释,让它解析为默认行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2013-06-26
    • 1970-01-01
    • 2016-01-10
    • 2015-07-15
    • 2017-04-12
    相关资源
    最近更新 更多