java - Jersey Web 服务不处理 XML,而是处理 JSON

标签 java rest maven jaxb jersey

我目前正在开发 Jersey/Hibernate Web 服务(在 Tomcat 9 容器中),它应该能够使用和生成 JSON (application/json) 和 XML (application/xml)。它支持 GET 和 POST 来使用这些类型。支持并运行 DELETE,以及 JSON 的 GET 和 POST。但是,一旦我对 XML 内容类型尝试相同的操作,我就会收到 500 内部服务器错误。

结构如下:(查看下面的代码) 歌曲列表(Songlist 类)具有歌曲列表和所有者(User 类)。

您可以在 XML 格式的/(myWSname)/songs/{id} 下获取一首歌曲,也可以毫无问题地发布一首歌曲。

我认为这里的问题是 XML 注释,因为对于 JSON,一切都像现在一样工作。我尝试添加@XmlElement 和@AccessorType(FIELD)。这些都没有帮助。此外,对于/(myWSname)/songs/{id} 下的歌曲,一切正常。

    @Entity
    @Table(name="songlists")
    @XmlRootElement(name = "songList")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Songlist {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonProperty(value = "id")
    @XmlElement
    private int id;

    @JsonProperty("name")
    @XmlElement
    private String name;

    @ManyToOne
    @JsonProperty("owner")
    @JoinColumn(name = "owner_id")
    @XmlElement
    private User owner = null;

    @JsonProperty("isPrivate")
    @XmlElement
    private boolean isPrivate;


    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "songlists_songs", joinColumns = {    @JoinColumn(name = "list_id") }, inverseJoinColumns = {
            @JoinColumn(name = "song_id") })
    @XmlElementWrapper(name = "songs")
    @XmlElement(name = "song")
    @JsonProperty(value = "songs")
    private List<Song> songs = null;


    //JAXB no arg constructor 
    public Songlist() {
    }

    // Here: other constructors
    // and Getters and Setters for all fields 


    }```


@Entity
@XmlRootElement(name = "song")
@XmlAccessorType(XmlAccessType.FIELD)
@Table(name="songs")
public class Song {

@Id
@Column(name="song_id")
@JsonProperty("id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@XmlAttribute (name = "id")
private Integer id;

@NotNull
@JsonProperty("title")
@XmlAttribute (name = "title")
private String title;

@JsonProperty("artist")
@XmlAttribute (name = "artist")
private String artist;


@JsonProperty("album")
@XmlAttribute (name = "album")
private String album;


@JsonProperty("released")
@XmlAttribute (name = "released")
private Integer released;

@JsonIgnore
@XmlTransient
@ManyToMany(fetch = FetchType.EAGER, mappedBy="songs")
private List<Songlist> songlists;

//JAXB no arg constructor
public Song() {
}

// here: some other constructors
// and Getters and Setters for all fields

}```

不幸的是,没有与此相关的日志消息。根据我所做的研究,显然这是一个 JAXB 问题。

最佳答案

解决方案是使 User 类中的 Songfest 字段(我没有发布,因为我没想到这是错误源)XML transient ,因为这将引用歌曲列表,而歌曲列表将引用用户。显然是无限循环。

关于java - Jersey Web 服务不处理 XML,而是处理 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56724338/

相关文章:

javascript - 将 Promise 与循环和嵌套函数一起使用

eclipse - 是什么导致 jakarta.ws.rs.ext.RuntimeDelegate 的 Maven 依赖项中出现 java.lang.ClassNotFoundException?

java - Jenkins :java.io.IOException:文件名、目录名或卷标语法不正确

java - 将十六进制答案转换为 Dec?

java - JUnit 测试用例 - 看不到类

java - 通过成员注解获取外部类

java - 是否可以将多个位图图像堆叠在一起?

java - 找不到简单 Jersey Hello World 404 资源

http - 在 WADL 中定义 HTTP 基本身份验证 header 的最具描述性的方法是什么?

java - Maven:从编译中排除文件在 IntelliJ IDEA 中不起作用