2016-05-04 6 views
3

Ich benutze die neueste Version von Jersey für einen API-Server. I definiert die nächste Ressource:Wie wählt Jersey/Jax-RS die richtige Methode in einer Ressource

@javax.ws.rs.Path("/myPath") 
public class MyResource { 

    @GET 
    @Consumes({MediaType.WILDCARD, MediaType.TEXT_PLAIN, MediaType.TEXT_HTML}) 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response method1(@Context Request request) { 
    } 

    @GET 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public MyObject method2() {} 

} 

Jetzt können sagen, dass ich diese Ressource mit dem nächsten Kopf nenne:

<header> 
    <name>Accept</name> 
    <value>text/html, application/xhtml+xml, */*</value> 
</header> 

Wie funktioniert Jersey weiß, was man in diesem Fall zu entsprechen, wo kein Verfahren Producer Anmerkung stimmt überein? Ich frage, weil einmal der Server auf die Methode2 geantwortet hat und nach dem Neustart es auf Methode1 geantwortet hat.

+0

Ich aktualisierte das Ticket Ich testete es. Ich bekomme keine 406. Ich habe gerade meinen Server neu gestartet und die Entscheidung von Jersey ist anders. Ich weiß über */* - aber wie wählt Jersey die richtige Methode aus? –

+0

Sieht geschlossen, aber sie sprechen nur über "Path" -Ebene Entscheidung, und nicht über Attribute Entscheidungen –

Antwort

1
<header> 
    <name>Accept</name> 
    <value>text/html, application/xhtml+xml, */*</value> 
</header> 

Ich weiß nicht, was das ist; Header werden nicht in XML gesendet, aber vorausgesetzt, Sie haben den Header korrekt gesendet, so ist dieser Fehler behoben.

@Produces nimmt die Accept Header und @Consumes behandelt den Client Content-Type Header, wenn der Client Daten sendet. Also lassen Sie uns an Ihren beiden @Produces Anmerkungen sehen, gegen die Accept Header

@Produces(MediaType.TEXT_PLAIN) 
public Response method1() {} 

@Produces(MediaType.APPLICATION_JSON) 
public MyObject method2() {} 

text/html, application/xhtml+xml, */* 

so keiner von ihnen text/html haben, so kreuzen, dass aus. Keiner von ihnen hat application/xhtml+xml, also kreuzen Sie das aus. Das lässt nur */*, was bedeutet "sende mir was auch immer". So Jersey ist frei, welches zu wählen. Die Ergebnisse sind unvorhersehbar. Sie können keine Vermutungen darüber machen. Und das ist die Schuld des Kunden. Nicht unseres. Der Client sollte den richtigen Header senden. Oder vielleicht sollten wir eine bessere Arbeit tun, unsere API zu dokumentieren, damit der Klient weiß, welche Typen wir produzieren können :-)

+1

Der Header ist nur von einem Schnappschuss der Kopfzeile mit Chrome-Entwickler-Tools. Ich habe erwartet, Fehler zu bekommen, wenn es keine Übereinstimmung gibt. Sie sagen also, dass es zufällig ausgewählt wird, wenn es keine eindeutige Übereinstimmung gibt? –

0

Ich lief in das gleiche Problem, wo ich Methoden mit einer spezifischen @Produces() Anmerkungen habe. Dieser Trick funktioniert:

@Produces(MediaType.APPLICATION_JSON) 
public Response method1() {} 

@Produces({MediaType.TEXT_PLAIN, "*/*;q=0"}) 
public Response method2() {} 

Wenn MIME-Typen verwenden, können Sie die q Eigenschaft hinzufügen, die Priorität (0 bis 1) zeigt. Das Fehlen der q Eigenschaft impliziert 1, aber offenbar die q=0 Tricks Jersey, um die andere Funktion zu verwenden.

Es ist eine Art von Hack, also weiß ich nicht, ob es funktionieren wird, aber half mir aus.