2012-11-22 14 views
11

क्या यह अपाचे सीएक्सएफ (2.7.0) से क्लासपाथ में स्वचालित रूप से जेएक्स-आरएस संसाधनों को खोज सकता है? यही है, @Path के साथ एनोटेटेड कक्षाएं।स्प्रिंग एप्लिकेशन में सीएक्सएफ के साथ ऑटोडिस्कवर जेएक्स-आरएस संसाधन

मैं एक स्प्रिंग एप्लिकेशन में सीएक्सएफ का उपयोग कर रहा हूं और मुझे संसाधनों को मैन्युअल रूप से निम्न XML के साथ घोषित करना है, भले ही संसाधन सफलतापूर्वक वसंत <context:component-scan ...> द्वारा खोजे जाते हैं।

<jaxrs:server id="myService" address="/myService"> 
    <jaxrs:serviceBeans> 
     <ref bean="myResource1" /> 
     <ref bean="myResource2" /> 
     <ref bean="myResource3" /> 
    </jaxrs:serviceBeans> 
</jaxrs:server> 

मैं इसे से बचने के लिए, क्योंकि मेरे मामले में यह कठिन है बनाए रखने के लिए (के रूप में मैं इस तरह के resteasy के रूप में अन्य JAX-आरएस कार्यान्वयन के साथ कर सकते हैं) चाहते हैं, और यह मेरे लिए मजबूर करता वसंत में मेरे सेम निर्भरता घोषित करने के लिए एक्सएमएल विन्यास फाइल।

+0

FWIW में CXF-सर्वलेट उल्लेख करने के लिए, मैं इसे बहुत उपयोगी बातें स्पष्ट रूप से घोषित करने के लिए लगता है। लेकिन फिर मेरे पास एक ही एप्लिकेशन में कई '' घोषणाएं हैं, प्रत्येक एक अलग कॉन्फ़िगरेशन (उदा।, विभिन्न एक्सएमएल धारावाहिक) के साथ। RESTeasy दृष्टिकोण लचीला नहीं है ... –

उत्तर

6

ऐसा लगता है कि इस समय सीएक्सएफ 2.7 में स्प्रिंग कॉन्फ़िगरेशन के साथ ऐसा करने का कोई तरीका नहीं है। यदि आप आराम से देखते हैं तो उन्होंने एक बीनफैक्टरीपोस्टप्रोसेसर स्प्रिंगबीनप्रोसेसर.जावा लागू किया है जो @Path और @Provider की तलाश में है। कुछ ऐसा ही संभवतः सीएक्सएफ में किया जा सकता है लेकिन यह अभी तक लागू नहीं किया जा रहा है। ऐसा लगता है कि आप केवल एक रुचि CXF-3725

8

इस कोड काम कर देता है नहीं कर रहे हैं:

@Configuration 
@ComponentScan 
@ImportResource({"classpath:META-INF/cxf/cxf.xml"}) 
public class Context { 
    @Autowired 
    private ApplicationContext ctx; 

    @Bean 
    public Server jaxRsServer() { 
     LinkedList<ResourceProvider> resourceProviders = new LinkedList<>(); 
     for (String beanName : ctx.getBeanDefinitionNames()) { 
      if (ctx.findAnnotationOnBean(beanName, Path.class) != null) { 
       SpringResourceFactory factory = new SpringResourceFactory(beanName); 
       factory.setApplicationContext(ctx); 
       resourceProviders.add(factory); 
      } 
     } 

     JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean(); 
     factory.setBus(ctx.getBean(SpringBus.class)); 
     factory.setProviders(Arrays.asList(new JacksonJsonProvider())); 
     factory.setResourceProviders(resourceProviders); 
     return factory.create(); 
    } 
} 

बस अपने web.xml में CXFServlet डाल करने के लिए याद है और आप कर रहे हैं।

+0

क्या किसी को इस पर वसंत के लिए ऑटो-कॉन्फ़िगर मिला? जैसे, मुझे एक बीन की आपूर्ति भी नहीं है? –

2

सुझाए गए सुझावों के अलावा: यह वास्तव में 3.0.0-मील का पत्थर 2 में काम करता है, कोई केवल शीर्ष स्तर के जैक्सर्स सर्वर घोषणा ही करेगा और बेसपैकेज विशेषता सेट करेगा जिसमें एक या अधिक स्थान अलग-अलग पैकेज नाम हो सकते हैं।

7

परीक्षण और सीएक्सएफ 3.0.4 में काम कर रहा है।

<jaxrs:server address="/" basePackages="a.b.c"/> 

भूल न web.xml

+0

मैं वसंत बूट के साथ ऐसा कैसे करूं? मुझे एक नया वर्ग/कोड मिला लेकिन मुझे कुछ अन्य समस्याएं हैं: JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean बीन = नया JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean(); bean.setBasePackages (संग्रह .singletonList (SimulationController.class.getPackage()। GetName())); वापसी bean.create(); –

+0

@ क्रिस्टियनबोंगियर्नो यहां सीएक्सएफ दस्तावेज़ों का लिंक है। वसंत बूट सेटअप के लिए अच्छा विवरण है। http://cxf.apache.org/docs/jaxrs-services-configuration.html#JAXRSServices कॉन्फ़िगरेशन-प्रिंगबूट –

+0

@AlexAmorales मैं पहले से ही वहां था। ये उदाहरण काम नहीं करते हैं। वह कॉन्फ़िगरेशन बीन कुछ भी नहीं करता है लेकिन एक्सएमएल आयात करता है। मैं इसे सेवा में प्रत्येक पथ बीन जोड़ना चाहता हूं। –

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