2013-09-05 6 views
7

मैं अंत में क्विकस्टार्ट आर्केटाइप का उपयोग कर जर्सी मोक्सी सेवा का निर्माण कर रहा हूं। मेरा कोड ठीक काम करता है और मैं कुछ JSON लौटा सकता हूं। हालांकि, जैसा कि मैं विकास कर रहा हूं, अगर मैं कोई गलती करता हूं, तो कहें कि हैंडलर के पास असमर्थित प्रकार है, मुझे एक खाली 500 प्रतिक्रिया मिलेगी, जो डिबगिंग को मुश्किल बनाती है। उदाहरण के लिए, अगर मैं @XmlElementRef साथ गलत तरीके से एक विशेषता को सजाने, मैं ऐसी ही प्रतिक्रिया मिल जाएगा:ग्रीज़ली जर्सी अपवादों को निगलने

$ curl -i http://localhost:8080/myapp/test 
HTTP/1.1 500 Internal Server Error 
Date: Thu, 05 Sep 2013 10:27:55 GMT 
Connection: close 
Content-Length: 0 

सर्वर अगर कुछ गलत है रूप में कार्य करेगा:

Sep 5, 2013 11:27:46 AM org.glassfish.grizzly.http.server.HttpServer start 
INFO: [HttpServer] Started. 
Jersey app started with WADL available at http://localhost:8080/application.wadl 
Hit enter to stop it... 

मैं एक लॉग config का उपयोग कर की कोशिश की फ़ाइल के साथ:

-Djava.util.logging.config.file=log.conf 

यह उत्पादन का भरपूर उत्पादन करता है, लेकिन फिर भी किसी भी प्रकार का अपवाद नहीं दिखाता है।

मैंने ग्रिज़ली कॉन्फ़िगरेशन को देखने का प्रयास किया है, लेकिन मुझे ग़लत त्रुटि प्रबंधन को बंद करने का कोई तरीका नहीं मिल रहा है। आदर्श रूप में मैं सर्वर को अपवाद फेंकना चाहता हूं। मुझे क्या याद आ रही है पर कोई सुझाव?

https://github.com/jersey/jersey/tree/2.2/examples/json-moxy/src/main/java/org/glassfish/jersey/examples/jsonmoxy

पूर्ण मूलरूप आदर्श पीढ़ी मैं प्रयोग किया है::

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \ 
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \ 
-DgroupId=com.myapp -DartifactId=yarese-service -Dpackage=com.myapp \ 
-DarchetypeVersion=2.2 

सुझाव कृतज्ञता

import org.glassfish.grizzly.http.server.HttpServer; 
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; 
import org.glassfish.jersey.moxy.json.MoxyJsonConfig; 
import org.glassfish.jersey.server.ResourceConfig; 

import javax.ws.rs.ext.ContextResolver; 
import javax.ws.rs.ext.Provider; 

import java.io.IOException; 
import java.net.URI; 
import java.util.*; 

public class Main { 
    // Base URI the Grizzly HTTP server will listen on 
    public static final String BASE_URI = "http://localhost:8080/"; 

    /** 
    * Starts Grizzly HTTP server exposing JAX-RS resources defined in this application. 
    * @return Grizzly HTTP server. 
    */ 
    public static HttpServer startServer() { 
     // create a resource config that scans for JAX-RS resources and providers 
     // in com.myapp package 
     final ResourceConfig rc = new ResourceConfig().packages("com.myapp").registerInstances(new JsonMoxyConfigurationContextResolver()); 

     // create and start a new instance of grizzly http server 
     // exposing the Jersey application at BASE_URI 
     return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc); 
    } 

    /** 
    * Main method. 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws IOException { 
     final HttpServer server = startServer(); 
     System.out.println(String.format("Jersey app started with WADL available at " 
       + "%sapplication.wadl\nHit enter to stop it...", BASE_URI)); 
     System.in.read(); 
     server.stop(); 
    } 

    @Provider 
    final static class JsonMoxyConfigurationContextResolver implements ContextResolver<MoxyJsonConfig> { 

     @Override 
     public MoxyJsonConfig getContext(Class<?> objectType) { 
      final MoxyJsonConfig configuration = new MoxyJsonConfig(); 

      Map<String, String> namespacePrefixMapper = new HashMap<String, String>(1); 
      namespacePrefixMapper.put("http://www.w3.org/2001/XMLSchema-instance", "xsi"); 

      configuration.setNamespacePrefixMapper(namespacePrefixMapper); 
      configuration.setNamespaceSeparator(':'); 

      return configuration; 
     } 
    } 
} 

कोड उदाहरण यहां के लगभग समान है:

यहाँ मेरी मुख्य कोड है प्राप्त किया।

+0

"... अगर मैं @XmlElementRef साथ गलत तरीके से एक विशेषता को सजाने ..." मैं एक ही मुद्दा था। लॉगिंग के साथ भी सभी तरह से बदल गया, मुझे अपने जेएक्सबी एनोटेशन के साथ गलत क्या था, इस बारे में कोई जानकारी नहीं मिली। मैंने [यह जर्सी मुद्दा] खोला [https://java.net/jira/browse/JERSEY-2321)। –

उत्तर

12

अपवाद ग्रिज़ली परत के लिए प्रचारित नहीं हो रहा है, इसलिए इसे जर्सी द्वारा लॉग किया जाना चाहिए। मुझे नहीं मिला कि आपको किस प्रकार का लॉगर सक्षम करना है, लेकिन ऐसा लगता है कि कस्टम अपवाद मैपर मदद कर सकता है।

import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 
import javax.ws.rs.ext.Provider; 
import org.glassfish.grizzly.utils.Exceptions; 

@Provider 
public class MyExceptionMapper implements 
     ExceptionMapper<WebApplicationException> { 
    @Override 
    public Response toResponse(WebApplicationException ex) { 
     return Response.status(500).entity(Exceptions.getStackTraceAsString(ex)).type("text/plain") 
       .build(); 
    } 
} 
+1

मैंने इस दृष्टिकोण का उपयोग किया, और मैंने पाया कि यह बहुत अच्छी तरह से काम कर रहा है। Http://stackoverflow.com/questions/19621653/how-should-i-log-uncaught-exceptions-in-my-restful-jax-rs-web-service – emas

+2

में इस पर भी चर्चा की गई है मैंने एक अतिरिक्त 'अपवाद मैपर' जोड़ा एक अपवाद के रूप में 'अपवाद' के लिए। मेरे परिदृश्य में 'रनटाइम अपवाद' कहां खो गया, और अब मैं उन्हें लॉग कर सकता हूं और आउटपुट को नियंत्रित कर सकता हूं। – Hank

1

जैसा कि आपने देखा है, ग्रीज़ली java.util.logging का उपयोग करता है। यदि आप स्टैकट्रैक देखना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि स्तर log.conf फ़ाइल में सही ढंग से सेट हो जाएं।

यहां वे सेटिंग है कि अतीत में मेरे लिए काम किया है इस प्रकार हैं:

handlers=java.util.logging.ConsoleHandler 
java.util.logging.ConsoleHandler.level=ALL 
.level=ALL 
org.glassfish.level=CONFIG 
+0

मुझे सभी अपवाद प्राप्त करने के लिए 'org.glassfish.level = CONFIG'' org.glassfish.level = ALL' को बदलने की आवश्यकता है। – zpon

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