2010-08-11 13 views
6

मेरी यूनिट-परीक्षण के लिए मैं एक साधारण परीक्षण सर्वर जेट्टी के आधार पर का उपयोग करें: सर्वलेट के लिए बहुत अच्छी तरह सेसर्वलेट एम्बेडेड जेट्टी में 3.0 समर्थन 8.0

package eu.kostia.textanalysis.webservices.jetty; 

import java.awt.Desktop; 
import java.net.URI; 

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.webapp.WebAppContext; 

public class TestServer { 
static private final String CONTEXT_PATH = "/webservice"; 
static private final String PROJECT_HOME = System.getenv("MY_WORKSPACE_HOME") + "/WebServices"; 
static public final int PORT = 8080; 

private Server server; 
private Exception startException; 

private static class SingletonHolder { 
    private static final TestServer INSTANCE = new TestServer(); 
} 

/** 
    * Returns the singleton instance of the test server. 
    * 
    * @return the singleton instance of the test server. 
    */ 
public static TestServer getInstance() { 
    return SingletonHolder.INSTANCE; 
} 

private TestServer() { 
    server = new Server(PORT); 

    WebAppContext context = new WebAppContext(); 

    context.setDescriptor(PROJECT_HOME + "/web/WEB-INF/web.xml"); 
    context.setResourceBase(PROJECT_HOME + "/web"); 
    context.setContextPath(CONTEXT_PATH); 
    context.setParentLoaderPriority(true); 


    server.setHandler(context); 
} 

/** 
    * Start the test server. This method returns only when the server is 
    * complete started. There is no effect when you invoke this method and the 
    * server is already running. 
    */ 
public void start() { 
    if (!server.isRunning()) { 
    startException = null; 
    new Thread("TestServer") { 
    public void run() { 
    try { 
     server.start(); 
     server.join(); 
    } catch (Exception exc) { 
     startException = exc; 
    } 
    } 
    }.start(); 

    while (true) { 
    if (startException != null) { 
    throw new Error(startException); 
    } 

    // Block this method call until the server is started 
    if (server.isStarted()) { 
    return; 
    } 
    } 
    } 
} 

/** 
    * Stop the test server. 
    */ 
public void stop() { 
    try { 
    if (server.isRunning()) { 
    server.stop(); 
    } 
    } catch (Exception e) { 
    throw new Error(e); 
    } 
} 

/** 
    * Returns {@code true} is the server is running. 
    * 
    * @return {@code true} is the server is running. 
    */ 
public boolean isRunning() { 
    return server.isRunning(); 
} 

public static void main(String[] args) throws Exception { 
    TestServer.getInstance().start(); 
    Desktop.getDesktop().browse(new URI("http://localhost:8080/webservice/")); 
} 

} 

यह काम करता है web.xml में विन्यस्त लेकिन मैं अब टिप्पणियों के लिए नए वाक्य रचना सर्वलेट विशिष्टता 3.0 द्वारा शुरू की, उदाहरण के लिए उपयोग करने के लिए:

@WebServlet(urlPatterns = {"/hello"}) 
public class HelloServlet extends HttpServlet { 
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
       PrintWriter writer = response.getWriter(); 
       writer.print("<h1>HttpServlet using Servlet 3.0</h1>"); 
     } 
} 

मैं अपने TestServer वर्ग भी एनोटेशन आधारित सर्वलेट को संसाधित करने के घाट कॉन्फ़िगर shoud?

उत्तर

0

जेट्टी 8 सर्वलेट 3.0 विनिर्देशन को कार्यान्वित कर रहा है लेकिन यह अभी भी प्रयोगात्मक है।

आप अपने परीक्षण चलाने के लिए एम्बेडेड ग्लासफ़िश 3 प्लगइन का भी उपयोग कर सकते हैं। कुछ जानकारी के लिए नीचे दिए गए लिंक देखें: http://wikis.sun.com/display/GlassFish/3.1EmbeddedOnePager http://ocpsoft.com/java/using-embedded-glassfish-with-maven/ http://embedded-glassfish.java.net/

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

मुझे आशा है कि इससे कम से कम थोड़ा सा मदद मिलेगी।

8

अपने कोड

context.setConfigurations(new Configuration[] { 
       new AnnotationConfiguration(), new WebXmlConfiguration(), 
       new WebInfConfiguration(), new TagLibConfiguration(), 
       new PlusConfiguration(), new MetaInfConfiguration(), 
       new FragmentConfiguration(), new EnvConfiguration() }); 

आप केवल काम करने के लिए टिप्पणी किए गए वर्गों में से स्वत: खोज पाने के लिए AnnotationConfiguration निर्धारित करने की आवश्यकता में जोड़े। शेष कॉन्फ़िगरेशन हैं ताकि आप कंटेनर के अन्य पहलुओं को सक्षम कर सकें। माना जाता है कि आप OPTIONS = एनोटेशन, जेएसपी, (आदि ...) का उपयोग करके कमांडलाइन से ऐसा करने में सक्षम होना चाहिए, लेकिन मुझे यह काम कभी नहीं मिला। कम से कम इस तरह से इसे एम्बेडेड वातावरण में अपने एनोटेटेड कक्षाओं को ठीक से उठाया जाना चाहिए।

इसके अलावा एक साइड नोट के रूप में ऐसा लगता है कि ग्रहण जेटी प्रोजेक्ट ने डिफ़ॉल्ट रूप से एनोटेशन बंद कर दिया है, जबकि रिप्टाइड का दावा है कि उन्हें डिफ़ॉल्ट रूप से चालू किया जाता है। मुझे लगता है कि यह विन्यास फाइलों में एक अंतर है।

+0

मुझे एहसास है कि पोस्ट प्राचीन है, लेकिन मुझे पता चला कि इस पोस्ट के बाद भी मुझे एम्बेडेड सर्वर के साथ एक ही समस्या थी। –

+1

मैंने पाया कि AsyncContext जेटी में बिल्कुल सही काम नहीं कर रहा था। मैंने इसे एंबेडेड टॉमकैट 7 के पक्ष में रहने के लिए छोड़ दिया। जो कि समय के लिए अच्छी तरह से काम कर रहा है। –

1

एक और साल बाद उत्तर देना।

वर्तमान जेट्टी के संस्करण (8.1) आप वास्तव में क्या आप कमांड लाइन के साथ चाहते हैं को पूरा कर सकते हैं:

java -jar start.jar OPTIONS=annotations,plus etc/jetty-plus.xml 

घाट घर निर्देशिका से सक्रिय किया गया।

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