2011-04-05 8 views
11

मुझे माफ़ कर दो, लेकिन मैं इस प्रश्न को ठीक से पूछने के लिए आवश्यक सभी लिंगो से परिचित नहीं हो सकता।जैक्स-आरएस में सामग्री प्रकार बदलना REST सेवा

मैं जैक्स-आरएस के org.apache.cxf.jaxrs.ext कार्यान्वयन का उपयोग कर जावा में एक काफी सरल आरईएसटी वेब सेवा पर काम कर रहा हूं। विधि हेडर कुछ इस तरह है:

@GET 
@Path("json/{fullAlias}") 
@Produces({"application/json"}) 
public String json(@PathParam("fullAlias") String fullAlias, @Context MessageContext req) 

जहां MessageContext org.apache.cxf.jaxrs.ext.MessageContext है।

दो चीजें मैं पूरा करने के लिए है कि मैं यह पता लगाने की कोशिश कर रहा हूँ नहीं कर पा रहे हैं:

  1. बदलें सामग्री प्रकार यदि कुछ शर्तों (एक त्रुटि के लिए उदाहरण के लिए)
  2. बदलें मुलाकात कर रहे हैं प्रतिक्रिया की स्थिति कोड

मैं MessageContext के माध्यम से एक्सेस करके उसका उत्तर को बदल कर उपयोग करने की कोशिश की है:

HttpServletResponse response = req.getHttpServletResponse(); 
response.setContentType("text/plain") 
response.setStatus("HttpServletResponse.SC_BAD_REQUEST); 

लेकिन इन परिवर्तनों को प्रतिक्रिया प्रतिक्रिया पर कोई असर नहीं पड़ता है; @ प्रोड्यूस एनोटेशन के साथ या उसके बिना, विधि के अंदर सामग्री प्रकार को सेट करने से वास्तविक सामग्री प्रकार को प्रभावित नहीं होता है (एनोटेशन के साथ, यह निश्चित रूप से "एप्लिकेशन/जेसन" देता है, बिना इसे "टेक्स्ट/एचटीएमएल" पर डिफ़ॉल्ट करता है)।

मैं शरीर के रूप में एक साधारण स्ट्रिंग लौट रहा हूं। मैंने javax.ws.rs.core.Response ऑब्जेक्ट को वापस करने की कोशिश करने का प्रयास किया है जो मैं चाहता हूं, लेकिन मुझे इसके बारे में बहुत कुछ पता नहीं है।

मैं इस विधि के अंदर से सामग्री प्रकार और/या स्थिति कोड कैसे बदलूं?

उत्तर

28

पेस द्वारा वर्णित एक वेब अनुप्रयोगण फेंकना एक दृष्टिकोण है, जो काम करेगा यदि आप विशेष रूप से त्रुटि स्थिति को संभालने के लिए देख रहे हैं। यदि आप किसी भी समय किसी भी कारण से अपनी सामग्री को बदलने में सक्षम होना चाहते हैं, तो आप स्ट्रिंग के बजाए अपनी सेवा विधि के परिणामस्वरूप प्रतिक्रिया वापस करने पर एक नज़र डालना चाहेंगे। एक प्रतिक्रिया लौटने से आपको क्लाइंट अनुरोध पर आपकी सेवा का जवाब देने के तरीके पर सबसे अधिक नियंत्रण मिल जाता है (इसे सरल स्ट्रिंग लौटने से अधिक कोड की आवश्यकता होती है)।

@GET 
@Path("json/{fullAlias}") 
public Response json(@PathParam("fullAlias") String fullAlias, @Context MessageContext req) { 
    ... 
    if (success) { 
     ResponseBuilder rBuild = Response.ok(responseData, MediaType.APPLICATION_JSON); 
     return rBuild.build(); 
    } 
    else { 
     ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST); 
     return rBuild.type(MediaType.TEXT_PLAIN) 
        .entity("error message") 
        .build(); 
    }  
} 
+0

धन्यवाद!मैं सोच रहा था कि ऐसा कुछ काम करेगा, लेकिन आप मुझे बताएं कि यह कैसे करें। – Indigenuity

1

मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है लेकिन मैंने आपके प्रश्न # 1 को हल करने के लिए निम्नलिखित किया है।

public WebApplicationException createStatusException(String statusMessage) { 
    ResponseBuilder rb = Response.noContent(); 
    rb = rb.type(MediaType.TEXT_PLAIN); 
    rb = rb.status(Status.BAD_REQUEST); 
    rb = rb.entity(statusMessage); 
    return new WebApplicationException(rb.build()); 
} 

संपादित करें: मैं फिर परिणामी WebApplicationException फेंक दिया।

+0

यह एक और अर्द्ध समाधान से बेहतर काम करता है मैंने अभी कोशिश की: response.sendError (HttpServletResponse.SC_BAD_REQUEST, "यहां संदेश"); इसने केवल एक प्रतिक्रिया की, और क्लाइंट को पहले से ही एक प्रतिक्रिया प्राप्त होने के बाद विधि चल रही थी। – Indigenuity

0

आप सामग्री प्रकार हेडर बदलने के लिए अपनी खुद की प्रतिक्रिया फ़िल्टर लिख सकते हैं:

का तरीका यहां बताया रिस्पांस वस्तु का उपयोग कर सकते हैं का एक उदाहरण है।

@Provider 
public class MimeAddingFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) 
     throws IOException { 
     responseContext.getHeaders().add("Content-Type", "image/png"); 
    } 

} 

यह फ़िल्टर "छवि/पीएनजी" सामग्री-प्रकार शीर्षलेख जोड़ देगा। आप जेएक्स-आरएस प्रतिक्रिया फ़िल्टर में हेडर को भी बदल या हटा सकते हैं।

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