Веб-сервис Rest с использованием интерфейсов - PullRequest
1 голос
/ 02 марта 2012

Я пытаюсь создать веб-сервис REST в Java с использованием RestEasy с дизайном, аналогичным приведенным ниже примерам классов:

@Path("/rest")
public class TestRestService {
    @GET
    @Path("/test")
    @Produces("application/xml")
    public Response sayTestXml() {
        return getImplementation();
    }

    public Response getImplementation() {
        IInterface refToImpl = TestService.getImplementation(); 
        return Response.status(Status.OK).entity(refToImpl).build();
    }
}

public class TestService {
    public static IInterface getImplementation() {
        IInterface ref = new Implementation();
        return ref;
    }
}

public interface IInterface {
    public long getLong();
    public String getString();
    public boolean getBoolean();
    public List<IRelatedInterface> getRelations();
}

public interface IRelatedInterface {
    public float getFloat();
    public char getChar();
    public byte getByte();  
}

@XmlRootElement(name="interface")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Implementation implements IInterface {

    @XmlElement(name="tlong",  required=true)
        public long getLong() {
        return 42;
    }

    @XmlElement(name="tstring", required=true)
    public String getString() {
        return "test";
    }

    @XmlElement(name="tboolean", required=true)
    public boolean getBoolean() {
        return false;
    }

    @XmlElementWrapper(name = "relations")
    @XmlElement(name = "relation", required=false)
    public List<IRelatedInterface> getRelations() {

        List<IRelatedInterface> list = new ArrayList<IRelatedInterface>();
        RelatedImplementation impl = new RelatedImplementation();
        list.add(impl);

        return list;
    }
}

@XmlRootElement(name="relatedInterface")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class RelatedImplementation implements IRelatedInterface {

    @XmlElement(name="tfloat",  required=true)
    public float getFloat() {
        return 1.23f;
    }

    @XmlElement(name="tchar",  required=true)
    public char getChar() {
        return 'A';
    }

    @XmlElement(name="tbyte",  required=true)
    public byte getByte() {
        return 'Z';
    }
}

Итак, когда я пробую этот дизайн, JAXB жалуется, как показано ниже:

com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 числа IllegalAnnotationExceptions com.intuit.whitespace.IRelatedInterface - это интерфейс, и JAXB не может обрабатывать интерфейсы .эта проблема связана со следующим местоположением: на com.intuit.whitespace.IRelatedInterface на общедоступном java.util.List com.intuit.whitespace.Implementation.getRelations () на com.intuit.whitespace.Implementation com.intuit.whitespace.IRelatedInterface не имеет конструктора по умолчанию без аргументов .эта проблема связана со следующим местоположением: в com.intuit.whitespace.IRelatedInterface в публичном java.util.List com.intuit.whitespace.Implementation.getRelations () в com.intuit.whitespace.Implementation

У меня вопрос, есть ли способ решить это?Я пробовал некоторые вещи, но ни одна из них не сработала.Я рассматриваю Spring OXM или решение на основе MessageBodyWriter, но я хотел спросить, есть ли другие предложения, которые могли бы помочь мне лучше?

1 Ответ

0 голосов
/ 02 марта 2012

Хорошо, я решил это, внеся следующие изменения:

Использовал атрибут type в @ XmlElement

public class Implementation implements IInterface {

    @XmlElementWrapper(name = "relations")
    @XmlElement(name = "relation", required=false, type=RelatedImplementation.class)
    public List<IRelatedInterface> getRelations() {
        ....
    }
}

Вот и все!

...