当前位置: 首页 > 知识库问答 >
问题:

RestWeb服务不返回XML响应,甚至在eclipse中没有登录控制台

谢胤
2023-03-14

创建restful应用程序,但它不会以XML格式返回响应。即使在点击URL时控制台上也没有日志“http://localhost:8080/message/webapi/messages".

我返回一个列表,并使用@products(MediaType.APPLICATION\uxml)以XML形式返回响应。

消息资源。Java语言

package org.porwal.restful.message.resources;

import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.porwal.restful.message.model.Message;
import org.porwal.restful.message.service.MessageService;

@Path("/messages")
public class MessageResource {

    MessageService ms = new MessageService();

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public List<Message> getMessage(){
        return ms.getAllMessage();
    }

}

Message.java

package org.porwal.restful.message.model;

import java.util.Date;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement( name = "Message" )
public class Message {

    public long id;
    public String message;
    public Date created;
    public String author;

    public Message() {

    }

    public Message(long id, String message, String author) {
        this.id = id;
        this.message = message;
        this.author = author;
        this.created = new Date();
    }

    public long getId() {
        return id;
    }
    @XmlElement (name = "ID")
    public void setId(long id) {
        this.id = id;
    }
    public String getMessage() {
        return message;
    }
    @XmlElement (name = "Message")
    public void setMessage(String message) {
        this.message = message;
    }
    public Date getCreated() {
        return created;
    }
    @XmlElement (name = "Created")
    public void setCreated(Date created) {
        this.created = created;
    }
    public String getAuthor() {
        return author;
    }
    @XmlElement (name = "Author")
    public void setAuthor(String author) {
        this.author = author;
    }

}

如果我不使用@XMLRootElement注释,并且TEXT_PLAIN可以通过URL很好地返回,那么这是可行的。我还尝试删除每个字段的@xmlement,但没有成功。当我删除@XMLRootElement时,可以在eclipse控制台上的日志中看到MessageBodyWriter错误,但当包含@XMLRootElement时,则在eclipse控制台和URL上没有日志。”http://localhost:8080/message/webapi/messages“抛出错误:

缺少@XmlRootElement的情况下出错。

org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo SEVERE: MessageBodyWriter not found for media type=application/xml, type=class java.util.ArrayList, genericType=java.util.List<org.porwal.restful.message.model.Message>. This exception comes only when i commented the line "//@XmlRootElement( name = "Message" )".

HTTP状态500-内部服务器错误

有人能告诉我我错过了什么吗?

共有1个答案

祁晟
2023-03-14

您需要将消息中的所有字段设置为私有。如果您将它们保留为公共的,那么JAXB将把它视为一个属性,并将其视为重复属性,因为您还有JavaBean属性(getter/setter)。

@XmlRootElement( name = "Message" )
public class Message {

    private long id;
    private String message;
    private Date created;
    private String author;

    // ...
}

我是如何通过使用通用的ExceptionMapper来解决这个问题的

@Provider
public class DebugExceptionMapper implements ExceptionMapper<Exception> {

    @Override
    public Response toResponse(Exception exception) {
        exception.printStackTrace();
        return Response.serverError().entity(exception.getMessage()).build();
    } 
}

您可以在应用程序中注册它,它将捕获未映射的异常,您可以用它做任何事情。这里我们只打印堆栈跟踪。如果我们不处理它,它就会被吞没,我们永远不会知道发生了什么。

使用ExceptionMapper运行应用程序时,我收到了一条错误消息。

Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 4 counts of IllegalAnnotationExceptions
Class has two properties of the same name "author"
    this problem is related to the following location:
        at public java.lang.String com.example.Message.getAuthor()
        at com.example.Message
    this problem is related to the following location:
        at public java.lang.String com.example.Message.author
        at com.example.Message
Class has two properties of the same name "created"
    this problem is related to the following location:
        at public java.util.Date com.example.Message.getCreated()
        at com.example.Message
    this problem is related to the following location:
        at public java.util.Date com.example.Message.created
        at com.example.Message
Class has two properties of the same name "id"
    this problem is related to the following location:
        at public long com.example.Message.getId()
        at com.example.Message
    this problem is related to the following location:
        at public long com.example.Message.id
        at com.example.Message
Class has two properties of the same name "message"
    this problem is related to the following location:
        at public java.lang.String com.example.Message.getMessage()
        at com.example.Message
    this problem is related to the following location:
        at public java.lang.String com.example.Message.message
        at com.example.Message

你可以清楚地看到问题所在。除了避免这个错误之外,这就是封装的工作原理;字段应该是私有的,并通过getter和setter公开。

 类似资料:
  • 我得到错误:com.microsoft.sqlserver.jdbc.SQLServerException:驱动程序无法通过使用安全套接字层(SSL)加密建立到SQL服务器的安全连接。错误:“SQL服务器没有返回响应。连接已关闭。” Hibernate配置: application.properties: pom.xml: SQLServerException: openssl客户端连接服务器:1

  • 我使用DynamoDB DocumentClient,使用类AWS删除多个表上的项。发电机B。文档客户端 问题是,当我尝试使用删除多个表时,它运行时没有删除该项目,但没有从AWS返回任何异常。我在想是因为我没有返回promise吗? 另一件事是,在DynamoDB页面上,它提到了写入容量: 一个写入容量单位表示大小不超过1 KB的项目每秒写入一次。如果需要写入大于1KB的项,DynamoDB将需要

  • 问题内容: 我的代码中有一个ajax调用。我想通过通话实现的效果很好。我想从数据库中删除一些记录,当通过ajax调用该方法时,该记录实际上被删除了,但是就像在symfony方法中,它必须返回一个响应,这就是为什么当执行该方法时会给我错误 我的Ajax电话是 而执行的方法是 我如何从该方法成功返回?有任何想法吗?谢谢 问题答案: 替换为。也不要忘记在顶部写。

  • 我正在学习Spring Boot。我创建了一个具有Spring Boot安全性的示例Spring Boot Web应用程序,它运行良好。 现在我想在同一个Web应用程序中添加Rest Webservice功能。 问题:当我尝试访问任何API时,我得到的响应是登录。jsp 要求:我希望不需要JSON响应身份验证和授权 要实现这一目标,我需要做哪些更改 Web安全配置:

  • 昨天工作正常,一夜之间Windows7重新启动,现在Eclipse不会完成加载--旋转器显示“Eclipse SDK(未响应)”对话框“用户操作正在等待”完成“构建工作区”。Android SDK内容加载器保持在0%我尝试过: eclipse-clean delete c:\program files\eclipse\configuration.settings\org.eclipse.ui.id

  • nginx代理服务响应成功,但没有返回内容 配置如下: