2012-12-04 13 views
6

हम वेब सेवा बनाने के लिए ड्रॉपविज़ार्ड/जर्सी का उपयोग कर रहे हैं। संसाधन में एक पथ है और विधि में एक उप-पथ है। जब प्रतिक्रिया उत्पन्न होती है (201) जिस विधि को हम प्राप्त कर रहे हैं उसका मार्ग हमारे द्वारा प्रदान किए गए स्थान पर प्रीपेड किया जाता है। किसी स्थान के साथ ठीक स्थिति लौटने पर (जिसे मैं जानता हूं), सब ठीक है, और जैसा कि हमने इसे प्रदान किया है, स्थान वापस लौटाया गया है।Javax Response स्थिति पर स्थान शीर्षलेख पथ सेट करते समय विधि पथ तैयार करता है

हम ऐसे स्थान को कैसे वापस कर सकते हैं जो हमारी विधि के स्थान का उप-पथ नहीं है?

नीचे दिए गए उदाहरण में: एक पाने के लिए "http: // localhost/foo/बार" (बनाया स्थिति) के स्थान के साथ प्रतिक्रिया करता है "http: // localhost/foo/बार/wibble" (ध्यान दें /foo/bar)

जबकि "http: // localhost/foo/baz" (ठीक स्थिति) प्राप्त करने के लिए "http: // localhost/wibble" के स्थान के साथ प्रतिक्रिया होती है जो हम चाहते हैं।

import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.Response; 
import java.net.URI; 

@Path("/foo") 
public class FooResource { 

    @POST 
    @Path("/bar") 
    public Response bar() { 

     URI uriOfCreatedResource = URI.create("/wibble"); 
     return Response.created(uriOfCreatedResource).build(); 
    } 

    @POST 
    @Path("/baz") 
    public Response baz() { 

     URI uriOfCreatedResource = URI.create("/wibble"); 
     return Response.ok().location(uriOfCreatedResource).build(); 
    } 
} 

उत्तर

4

ग्लासफ़िश (जावाईई 6) पर मुझे हुआ। मुझे लगता है कि यह एक बग है, लेकिन मैं वास्तविक यूआरआई रूपांतरण के लिए कोड खुदाई करने में कामयाब कभी नहीं ....

मैं एक समाधान है, हालांकि पाया है:

public Response bar(@Context UriInfo info) { 
    URI absoluteURI=info.getBaseUriBuilder().path("/wibble").build(); 
    return Response.created(absoluteURI).build(); 
} 
+0

धन्यवाद, मैं कोशिश करूँगा। हमारा वर्तमान वर्कअराउंड ऑब्जेक्ट में यूआरएल के साथ स्टेटस 200 वापस करना है, जो जेएसओएन को क्रमबद्ध हो जाता है। –

7

मामले किसी में यहाँ ठोकर के बारे में सोच इस; मैंने यह देखने के लिए जर्सी के कोड में खोला कि ऐसा क्यों होता है। यह आपकी समस्या & कार्लो के कामकाज की व्याख्या करनी चाहिए।

private void setHeaders(MultivaluedMap<String, Object> headers) { 
    this.headers = headers; 
    Object location = headers.getFirst(HttpHeaders.LOCATION); 
    if (location != null) { 
     if (location instanceof URI) { 
      final URI locationUri = (URI)location; 
      if (!locationUri.isAbsolute()) { 
       final URI base = (statusType.getStatusCode() == Status.CREATED.getStatusCode()) 
         ? request.getAbsolutePath() // WHY!? 
         : request.getBaseUri(); 
       location = UriBuilder.fromUri(base). 
         path(locationUri.getRawPath()). 
         replaceQuery(locationUri.getRawQuery()). 
         fragment(locationUri.getRawFragment()). 
         build(); 
      } 
      headers.putSingle(HttpHeaders.LOCATION, location); 
     } 
    } 
} 

दूसरे शब्दों में::

com.sun.jersey.spi.container.ContainerResponse इस रत्न शामिल किसी कारण से, किसी को फैसला किया कि यह एक अच्छा विचार है, तो प्रतिक्रिया अलग ढंग स्थान हैडर के इलाज के लिए था स्टेटस कोड 201 है। कार्लो की तरह, ध्यान दिया गया है कि पूर्ण पथ का उपयोग इस मुद्दे से बचाता है।

+0

वाह! जासूस काम के अच्छे हिस्से के लिए धन्यवाद - क्या "क्यों" टिप्पणी आपकी है, या मूल स्रोत में? (यानी, जर्सी डेवलपर्स को भी लगता है कि यह अजीब है?) –

+1

मैंने जोर देने के लिए क्यों जोड़ा, मुझे इसके बारे में अधिक स्पष्ट होना चाहिए था :) – henriks

+0

यह इसलिए हो सकता है क्योंकि विनिर्देश (http://www.w3.org/Protocols /rfc2616/rfc2616-sec10.html#sec10.2.2) "स्थान शीर्षलेख फ़ील्ड द्वारा दिए गए संसाधन के लिए सबसे विशिष्ट यूआरआई के साथ" कहता है। – Jonas

0

जर्सी 2.x में प्रासंगिक कोड पूरी तरह से लिखा गया था और दूसरे स्थान पर ले जाया गया था। वर्ग org.glassfish.jersey.server.ServerRuntime अंदर, निम्न विधि कहा जाता है, जबकि प्रतिक्रिया डेटा लेखन:

private static void ensureAbsolute(final URI location, final MultivaluedMap<String, Object> headers, 
             final ContainerRequest request) { 
     if (location == null || location.isAbsolute()) { 
      return; 
     } 
     // according to RFC2616 (HTTP/1.1), this field can contain one single URI 
     headers.putSingle(HttpHeaders.LOCATION, request.getBaseUri().resolve(location)); 
    } 

के रूप में, पहले कहा, जब तक कि आवेदन स्थान हेडर के लिए एक निरपेक्ष यूआरआई (यूआरआई कि http: या ftp: की तरह एक स्कीमा के साथ शुरू होता) सेट , जर्सी स्वचालित रूप से अनुरोध के आधार यूआरआई के साथ इसे प्रीपेड करता है।

यह अजीब बात है कि जर्सी इस व्यवहार को नियंत्रित या अक्षम करने की अनुमति नहीं देता है।

संबंधित मुद्दे