2016-05-01 10 views
1

Mit RestEasy kann ich eine @HeaderParam, @PathParam oder @QueryParam Anmerkungen zu den Eigenschaften eines der eingehenden Objektparameter verwenden?Wie kann ich mit RestEasy eine @HeaderParam-Annotation für die Eigenschaften eines der eingehenden Objektparameter verwenden?

Dies ist meine Methode:

@Consumes(MediaType.APPLICATION_JSON) 
@POST 
@Path("/test/{testPathParam}") 
@Produces(value = {MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN}) 
public Response test(
     @HeaderParam("testHeaderParam") String testHeaderParam, 
     @QueryParam("testQueryParam") String testQueryParam, 
     @PathParam("testPathParam") String testPathParam, 
     TestInputBean testInputBean 
) { 
    Logger.info(this, "testHeaderParam:     ", testHeaderParam); 
    Logger.info(this, "testQueryParam:      ", testQueryParam); 
    Logger.info(this, "testPathParam:      ", testPathParam); 
    Logger.info(this, "testInputBean.getTestHeaderParam(): ", testInputBean.getTestHeaderParam()); 
    Logger.info(this, "testInputBean.getTestQueryParam(): ", testInputBean.getTestQueryParam()); 
    Logger.info(this, "testInputBean.getTestPathParam(): ", testInputBean.getTestPathParam()); 
    Logger.info(this, "testInputBean.anotherParam():  ", testInputBean.anotherParam); 
    return null; 
} 

Dies wird TestInputBean (deleted die Getter und Setter):

public class TestInputBean { 
    @HeaderParam("testHeaderParam") 
    String testHeaderParam; 
    @QueryParam("testQueryParam") 
    String testQueryParam; 
    @PathParam("testPathParam") 
    String testPathParam; 
    String anotherParam; 
} 

Dies ist die Anfrage ist:

Request details

Dies ist der Ausgang:

testHeaderParam:     testHeaderParam-fromHeader 
testQueryParam:      testQueryParam-fromQuery 
testPathParam:      testPathParam-fromPath 
testInputBean.getTestHeaderParam(): null 
testInputBean.getTestQueryParam(): null 
testInputBean.getTestPathParam(): null 
testInputBean.anotherParam():  anotherParam-fromJson 

Aber das ist, was ich will:

testHeaderParam:     testHeaderParam-fromHeader 
testQueryParam:      testQueryParam-fromQuery 
testPathParam:      testPathParam-fromPath 
testInputBean.getTestHeaderParam(): testHeaderParam-fromHeader 
testInputBean.getTestQueryParam(): testQueryParam-fromQuery 
testInputBean.getTestPathParam(): testPathParam-fromPath 
testInputBean.anotherParam():  anotherParam-fromJson 

Ist das möglich?

+0

Ich weiß nicht, ob es mit RESTEasy funktioniert, aber mit Jersey würde '@ BeanParam' zum' TestInputBean' Methode Parameter funktionieren. Der Entity-Body sollte jedoch eine separate Objekteigenschaft innerhalb der Bean sein. Die JSON-Eigenschaften sollten nicht innerhalb der 'TestInputBean' liegen, sondern in einem separaten Objekt gekapselt sein. Ich sage, dass ich mit RESTEasy wegen des Entity Body nicht sicher bin. Ich weiß nicht, ob diese Unterstützung spezifisch für Jersey ist oder nicht. Sie können es versuchen, obwohl –

+0

Ja, so testet ich nur mit RESTEeasy, und Sie können nicht die Entity-Bean in die '@ BeanParam' Bean. Am besten können Sie alle '@ XxxParam' Parameter in der '@ BeanParam' Bean finden, und einfach die Entity Bean als separaten Methodenparameter behalten. –

+0

Ich habe nur alle testInputBean Eigenschaften außer dem Header entfernt, alle anderen entfernt Parameter von der Methode außer testInputBean, und entfernt alles außer dem Header aus der Anfrage. Und ich habe das Verb in GET geändert. Und ich habe "400: java.io.EOFException: Kein Inhalt zum Objekt aufgrund des Endes der Eingabe zugeordnet". Ich denke, es sieht ein Objekt und erwartet JSON. – mattalxndr

Antwort

2

Sie können alle @XxxParam Eigenschaften in eine Bean setzen, mit der @BeanParam Annotation, aber ich denke nicht, dass es möglich ist, auch die JSON-Entity-Bean in diese Bean aufzunehmen. Sie müssen nur als separaten Parameter angeben.

public class Bean { 
    @PathParam("id") 
    private String id; 
    @XxxParam("..") 
    private String param; 
    // getters and setters 
} 

@POST 
public Response(@BeanParam Bean bean, JsonBody entity) {} 

@BeanParam ist Standard JAX-RS (2.0) Annotation, aber hat eine spezifische Resteasy @Form Anmerkung, die genau die gleiche Art und Weise wie @BeanParam funktioniert. Siehe here for more info. Wenn Sie RESTEasy 2.x verwenden, können Sie nur @Form verwenden, da RESTEasy 2.x immer noch JAX-RS 1.x verwendet, das nicht über @BeanParam verfügt.

+0

Anders ausgedrückt, das Input-Objekt erhält seine Daten entweder von '@ HeaderParam',' @ PathParam', '@ QueryParam' usw. (mit' @ Form' oder '@ BeanParam' im Methodenparameter), oder es erhält seine Daten von der JSON (indem nicht die '@ Form' verwendet wird). Nicht beide. – mattalxndr