2015-05-25 10 views
0

пытаются использовать интерфейс в качестве параметра для JAX-WS веб-службы Интерфейсинтерфейс JAX-WS в качестве параметра

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlRootElement 
@XmlJavaTypeAdapter(TransactionBase.TransactionableAdapter.class) 
public interface Transactionable { 

public int getRecid() ; 
public void setRecid(int recid) ; 
} 

Реализация

import com.tr.route.transactions.Transactionable; 
@XmlRootElement 
@XmlType(name = "Transactionable") 
public class TransactionBase implements Transactionable{ 

    private int recid; 
    private String ref; 
    public TransactionBase(String type) { 
    System.out.println("TransactionBase.Constructor with param:" +  type); 
    } 

    public static TransactionBase valueOf(String allObject) { 
    System.out.println("TransactionBase.valueOf:"); 
    TransactionBase rezult = new TransactionBase(allObject); 
    return rezult; 
    } 
    public int getRecid() { 
     return recid; 
    } 

    public void setRecid(int recid) { 
     this.recid = recid; 
    } 
    // adapter 
    public static class TransactionableAdapter 
    extends XmlAdapter<TransactionBase, Transactionable> { 

    @Override 
    public TransactionBase marshal(Transactionable o) 
     throws Exception { 
     System.out.println("TransactionableAdapter:mashal:");   
     return (TransactionBase)o; 
    } 

    @Override 
    public Transactionable unmarshal(TransactionBase o) 
     throws Exception { 
     System.out.println("TransactionableAdapter:unmashal:"); 
    return (Transactionable)o; 
    } 
    } 
} 

класс веб-службы

import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

@Path("/ExternalTransactions") 
public class ExternalTransactions { 



@POST 
@Produces(MediaType.APPLICATION_XML) 
@Consumes(MediaType.APPLICATION_XML) 
@Path("/insertTransaction") 

@XmlElement(type=TransactionBase.class) 
public String insertTransaction(Transactionable insertRequest) { 

    String insertResponse = "method was called"; 

    return insertResponse; 
} 

}

Что бы я ни делал, я получаю:

Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions Transactionable is an interface, and JAXB can't handle interfaces. 

Пожалуйста, не перенаправляет меня: http://blog.bdoughan.com/2011/05/jaxb-and-interface-fronted-models.html

Позже Edit:

Я использую реализацию Джерси.

+0

Почему вы сохраняете аннотации jaxb на интерфейсе? Почему бы просто не поставить их на «TransactionBase»? –

ответ

2

Для типа параметра вам необходимо использовать некоторый класс java-bean, иначе JAX-RS не сможет создать и заполнить параметр для вашего метода перед его вызовом.

РЕДАКТИРОВАТЬ: Цитируя https://jersey.java.net/documentation/latest/jaxrs-resources.html#d0e2145:

В целом тип Java-параметра метода может:

примитивный тип;

Имейте конструктор, который принимает единственный аргумент String;

Имейте статический метод с именем valueOf или fromString, который принимает единственный аргумент String (см., Например, Integer.valueOf (String) и java.util.UUID.fromString (String));

Имейте зарегистрированную реализацию javax.ws.rs.ext.ParamConverterProvider Расширение JAX-RS расширения, которое возвращает экземпляр javax.ws.rs.ext.ParamConverter, способный преобразовать «из строки» для типа. или

Be List, Set or SortedSet, где T удовлетворяет 2 или 3 выше. Полученная коллекция доступна только для чтения.

+0

Привет, кажется, что адаптер не звонил, потому что я никогда не вижу его в журнале любого вызова. Вы хотите сказать, что я не могу использовать интерфейс в качестве параметра или сделать некоторое сопоставление для интерфейса? Можете ли вы отправить ссылку на документацию, пожалуйста? –

+0

Конечно! Я обновил ответ. –

+0

Привет @ Майкл Бар-Синай благодарит вас за помощь. Я добавил @XmlElement (type = TransactionBase.class) в методе, изменил Long на int, добавил contructor и метод valueOf(), теперь у меня другая ошибка. InboundJaxrsResponse {ClientResponse {method = POST, uri = http: // localhost: 8080/ExternalTransactions/jersey/ExternalTransactions/insertTr, status = 415, reason = Unsupported Media Type}} –