2013-03-16 3 views
5

में @AplplicationScoped बीन इंजेक्षन करने में असमर्थ मैंने जेएक्स-आरएस सेवा बनाई है जिसमें मैं एक आवेदन स्कॉप्ड बीन इंजेक्ट करना चाहता हूं। समस्या यह है कि बीन इंजेक्शन नहीं है। यह कैसे होता है और मैं इसे कैसे हल कर सकता हूं?जेएक्स-आरएस सेवा

JAX-आरएस सेवा:

@Path("room") 
public class RoomService { 

    @Inject 
    GameController gc; 

    public RoomService() {} 

    @Path("create") 
    @GET 
    @Produces("application/json") 
    public String create() { 
     Room r = new Room(); 
     gc.addRoom(r); // gc is null 
     return r.toJson(); 
    } 
} 

आवेदन सेम

import java.util.ArrayList; 
import javax.enterprise.context.ApplicationScoped; 
import javax.inject.Named; 
import pepuch.multuplayergameserver.entity.Game; 
import pepuch.multuplayergameserver.entity.Room; 

@Named 
@ApplicationScoped 
public class GameController { 

    private Game game; 

    public GameController() { 
     this.game = new Game(new ArrayList<Room>()); 
    } 

    public boolean addRoom(Room room) { 
     if (!game.getRooms().contains(room)) { 
      return game.getRooms().add(room); 
     } 

     return false; 
    } 

} 
+0

आपका 'गेम नियंत्रक' कोड संकलित नहीं होता है और '@ नामांकित' भी गायब है। कृपया अवांछित कोड न लिखें। इसके बजाय वास्तविक और परीक्षण कोड कॉपी करें। – BalusC

+2

मैंने इसे ठीक कर दिया है। माफ़ कीजिये। मैंने 'नामांकित 'जोड़ा है लेकिन यह अभी भी काम नहीं करता है। हालांकि मैं 'नामित' केवल 'ईएल' के लिए है, इसलिए मैंने इसे पहले क्यों नहीं जोड़ा। – pepuch

+2

क्यों @ नामित? कोई फर्क नहीं पड़ेगा। –

उत्तर

5

आप सेम यह इंजेक्शन के लिए योग्य बनाने के लिए एक प्रबंधित संसाधन बनाने की जरूरत है scoped। कम से कम, इंजेक्शन-योग्य बनाने के लिए जेएक्स-आरएस एसआईबी में @RequestScoped जोड़ें।

एक और वैकल्पिक एनोटेशन @ManagedBean है। बिंदु, है जर्सी वांछित इंजेक्शन लक्ष्य का समाधान नहीं होगा, अगर माता पिता सेम एक प्रबंधित संदर्भ में नहीं है

import javax.enterprise.context.RequestScoped 

@RequestScoped 
@Path("room") 
public class RoomService { 

    @Inject 
    GameController gc; 

    public RoomService() {} 

    @Path("create") 
    @GET 
    @Produces("application/json") 
    public String create() { 
     Room r = new Room(); 
     gc.addRoom(r); // gc is null 
     return r.toJson(); 
    } 
} 

संपादित करें: अपने वेब-INF फ़ोल्डर में एक beans.xml फ़ाइल के लिए सुनिश्चित हो ।

<beans xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 

    </beans> 

संपादित करें:: आपका beans.xml फ़ाइल कुछ कैसा दिखेगा this JIRA आधार पर, आप @RequestScoped@ManagedBean

+0

क्या आप एक उदाहरण जोड़ सकते हैं? मैंने जैक्स-आरएस कक्षा में '@ RequestScoped' जोड़ने की कोशिश की है लेकिन यह अभी भी काम नहीं करता है। – pepuch

+0

@ पेच, मेरा संपादन देखें। यह भी सुनिश्चित करें कि आपके वेब-आईएनएफ में beans.xml फ़ाइल है या अन्यथा सीडीआई इंजेक्शन नहीं होगा – kolossus

+0

प्रबंधित बीन अजीब लगता है? –

1

साथ की जगह ले सकती निर्मित संदर्भ वस्तु सर्वलेट, वेब सेवा और EJB आमंत्रण के दौरान सक्रिय है , या जेएसएफ अनुरोधों के लिए वार्तालाप संदर्भ वस्तु के मामले में।

आपको जेएक्स-आरएस सेवा से अनुरोध, दायरे और एप्लिकेशन सेम तक पहुंचने में कठिनाई हो सकती है क्योंकि यह स्पष्ट रूप से इसके लिए समर्थन नहीं बताती है, हालांकि आपके मामले में ऐसा लगता है कि आपको संदर्भ के बजाय एक सिंगलटन की आवश्यकता है सेम।

अगर आप CDI (beans.xml) का उपयोग कर रहे इस तरह रखें,

@Singleton 
public class GameController { 
    private Game game; 
    public GameController() { 
     this.game = new Game(new ArrayList<Room>()); 
    } 
.... 
} 

आप स्प्रिंग (कोई beans.xml) के साथ CDI उपयोग कर रहे हैं तो रख @Named

@Named 
@Singleton 
public class GameController { 
    private Game game; 
    public GameController() { 
     this.game = new Game(new ArrayList<Room>()); 
    } 
.... 
} 

यदि उपर्युक्त काम नहीं करता है तो मैं उपर्युक्त परिवर्तन के साथ 0xके रूप में अपनी जेएक्स-आरएस सेवा को चिह्नित करने का सुझाव दूंगा क्योंकि यह स्पष्ट नहीं है कि सीडीआई जेएक्स-आरएस सेवा का प्रबंधन करता है।

+0

धन्यवाद। मैं '@ सिंगलटन 'का उपयोग करने की कोशिश करूंगा। मैंने '@ एप्लिकेशनस्कोप्ड 'का उपयोग क्यों किया है? मैं जेईई में नया हूं और मैंने सोचा कि 'एप्लीकेशनस्कोप्ड' बीन 'सिंगलटन' की तरह काम करेगा। – pepuch

+0

तो पूरे जी कंटेनर के लिए 'सिंगलटन' बनाया गया है और' एप्लिकेशनस्कोप्ड 'केवल एप्लिकेशन के लिए बनाया गया है? – pepuch

+1

सीडीआई अपने स्वयं के बीन कंटेनर बनाता है यदि beans.xml मौजूद है और जब भी सिंगलटन के रूप में निर्दिष्ट नहीं किया जाता है तब तक नई ऑब्जेक्ट्स बनाकर आवश्यक सभी इंजेक्शन जोड़ता है, फिर यह ऑब्जेक्ट की एक ही प्रति का उपयोग करता है। अनुप्रयोगों को सीडीआई कंटेनर द्वारा बनाया और हटा दिया जाता है जब वेब ऐप का अनुप्रयोग संदर्भ बनाया जाता है, नष्ट हो जाता है। –

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