jacksonresteasyjava-ee-7

Multiple resource methods match request "POST /.../..."


I am doing a REST API with the Java Resteasy framework (using Jackson as well).

I was trying to define two API endpoints almost equal:

@POST
@Path("/addbook")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
public BookAdvanced addBook (BookAdvanced book){...}

@POST
@Path("/addbook")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
public Book addBook (Book book){...}

Is this possible? Depending on the XML content arriving, I want to execute one or the other method.

Here is book class:

package package1;

import javax.xml.bind.annotation.*;
import java.util.Date;

@XmlRootElement(name = "book")
public class Book {
    private Long id;
    private String name;
    private String author;

    @XmlAttribute
    public void setId(Long id) {
        this.id = id;
    }

    @XmlElement(name = "title")
    public void setName(String name) {
        this.name = name;
    }

    @XmlElement(name = "author")
    public void setAuthor(String author) {
        this.author = author;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getAuthor() {
        return author;
    }

    // Constructor, getters and setters
}

Here is the BookAdvanced class:

package package1;

import javax.xml.bind.annotation.*;
import java.util.Date;

@XmlRootElement(name = "book")
public class BookAdvanced {
    private Long id;
    private String name;
    private String author;
    private int year;

    @XmlAttribute
    public void setId(Long id) {
        this.id = id;
    }

    @XmlElement(name = "title")
    public void setName(String name) {
        this.name = name;
    }

    @XmlElement(name = "author")
    public void setAuthor(String author) {
        this.author = author;
    }

    @XmlElement(name = "year")
    public void setYear(int year) {
        this.year = year;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getAuthor() {
        return author;
    }

    public int getYear() {
        return year;
    }


    // Constructor, getters and setters
}

27-Jan-2023 12:33:18.238 WARN [http-nio-8080-exec-39] org.jboss.resteasy.core.registry.SegmentNode.match RESTEASY002142: Multiple resource methods match request "POST /hello/addbook". Selecting one. Matching methods: [public package1.BookAdvanced prova_gradle_war.HelloWorldResource.addBook(package1.BookAdvanced), public package1.Book prova_gradle_war.HelloWorldResource.addBook(package1.Book)]


Solution

  • Matching is based on the request URI and not the request body. There is no real way to match the path and decide the method to use based on the body.

    You could do something manually where you inspect the data and determine which type to create.