2012-11-30 10 views
5

जर्सी: 1.12 स्प्रिंग: 3.11 JDK: 1.6.0_35 बिलाव: 6..0.33जर्सी ;: SpringServlet के माध्यम से इंजेक्ट ExceptionMapper उदाहरण पंजीयन

मैं एक जर्सी सर्वलेट कि instantiated कर रहे हैं के लिए ExceptionMapper उदाहरणों रजिस्टर करने के लिए कोशिश कर रहा हूँ स्प्रिंगसर्वलेट के संदर्भ में स्प्रिंग आईओसी कंटेनर द्वारा, और जर्सी सर्वलेट प्रारंभिकरण के दौरान आप पुराने वर्ग में चल रहे हैं "घटक वर्ग एक्स का दायरा एक सिंगलटन होना चाहिए" अपवाद। मैं इस समय वास्तविक कोड पोस्ट करने की स्थिति में नहीं हूं, इसलिए मैं कार्यान्वयन के अनिवार्य रूप से यह देखने के लिए जा रहा हूं कि कुछ स्पष्ट रूप से किसी पर कूदता है, या यदि मेरे पास कुछ दस्तावेज पर ध्यान दिया जा सकता है चुक गया।

ExceptionMapper उदाहरण अनिवार्य रूप से इस प्रकार है:

// ... package definitions omitted ... 

@Provider 
@Singleton 
public class MyExceptionMapper 
    implements ExceptionMapper<MyException> 
{ 
    // ... injected attributes omitted ... 

    @Override 
    public Response toResponse(MyException exception) 
    { 
     // ... specific handling logic omitted ... 

     return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build(); 
    } 
} 

applicationContext.xml में सेम परिभाषा, के रूप में इस प्रकार है जो चूक गुंजाइश सिंगलटन करने के लिए (और एक स्पष्ट गुंजाइश विनिर्देशक जोड़ने व्यवहार बदलने के लिए प्रतीत नहीं होता है):

<bean id="myExceptionMapper" class="my.package.MyExceptionMapper" /> 

स्प्रिंग संदर्भ लोडर श्रोता और web.xml में SpringServlet विन्यास अनिवार्य रूप से बॉयलरप्लेट हैं, और सर्वलेट, लोड प्रारंभ और अन्य इंजेक्षन के साथ ठीक से संचालित होगा जब सेम defin गुण MyExceptionMapper के लिए इयनियन applicationContext.xml से टिप्पणी की गई है। लेकिन जब सेम परिभाषा applicationContext.xml में मौजूद है, मैं के प्रभाव को संदेश लॉग इन करें मिलती है:

SpringProviderFactory - Registering Spring bean, myExpectionMapper, of type my.package.MyExceptionMapper as a provider class 
SpringProviderFactory - Registering Spring bean, myServiceController, of type my.package.MyServiceController as a root resource class 
... other root resource classes loading ... 
SpringServlet - Exception occurred when initialization 
java.lang.RuntimeException: The scope of the component class my.package.MyExceptionMapper must be a singleton 
    at som.sun.jersey.core.spi.component.ioc.IoCProviderFactory.wrap(...) 

मैं स्कैन संकुल पदानुक्रम में MyExceptionMapper रखने आरंभीकरण के दौरान SpringServlet द्वारा उठाया जा करने के लिए की कोशिश की है, और में एक अलग पैकेज पदानुक्रम, और परिणाम नहीं बदलते हैं।

इस पर किसी भी सहायता या मार्गदर्शन की सराहना की जाएगी।

+0

आप की दोबारा जांच कर कि आप javax का उपयोग कर रहे हैं है। inject.Singleton और javax.inject एनोटेशन वसंत में सक्षम होते हैं? –

उत्तर

1

वसंत 3.2.3 और 2.3.1 जर्सी एकीकरण के साथ एक ही समस्या पर कदम रखा।

  1. टिप्पणी करना जर्सी @Service साथ @Provider वर्ग या यह स्पष्ट रूप से सिंगलटन एप्लिकेशन संदर्भ एक्सएमएल में

    @Service //implies a singleton-scope 
    @Provider 
    public class UnhandledExceptionMapper implements ExceptionMapper<Throwable> { 
    
        @Override 
        public Response toResponse(Throwable exception) { //... 
    
  2. जोड़ना पैकेज कि प्रदाता वर्ग में शामिल कर रही है:

    क्या मेरे लिए काम किया दो के संयोजन था जर्सी संकुल के लिए, मैं MyApplication कक्षा में यह करने के लिए पसंद करते हैं:

    public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
        packages("com.mycompany.api.controller", "com.mycompany.api.jersey"); 
          //.... 
        } 
    } 
    
1

मैं एक ही मुद्दा था, लेकिन एक MessageReaderWriterProvider वर्ग के साथ:

:

package my.provider.package; 
... 
@Provider 
@Consumes({MediaType.APPLICATION_JSON, "text/json"}) 
@Produces({MediaType.APPLICATION_JSON, "text/json"}) 
public class ReRwProvider extends AbstractMessageReaderWriterProvider<Object> { 
... 
} 

समाधान web.xml में जर्सी के SpringServlet के लिए एक init-परम टैग में इस वर्ग के पैकेज को जोड़ने के लिए था

<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>my.provider.package</param-value> 
</init-param> 

ध्यान दें कि आपको अपने वसंत संदर्भ में इस बीन को परिभाषित नहीं करना चाहिए।

4

मेरा ExceptionMapper एस संरचना के तहत हैं जहां मैं घटक स्कैन कर रहा हूं, और मेरी बस स्प्रिंग रजिस्ट्री के लिए @Component और जर्सी के लिए @Provider के साथ एनोटेटेड हैं।

मेरे घटक स्कैन बस लगता है कि:

<context:component-scan base-package="com.company.web"/> 

और ExceptionMapper आपके जैसे काफी दिखता है:

package com.mycompany.web.provider; 

import com.mycompany.exception.SpecialException; 
import com.mycompany.exception.Error; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 
import javax.ws.rs.ext.Provider; 

@Provider 
@Component 
public class SpecialExceptionMapper implements ExceptionMapper<SpecialException> { 

    @Autowired 
    private MessageSource messageSource; 

    @Override 
    public Response toResponse(SpecialException exception) { 

     Error error = new Error(); 


     error.errorMessage = messageSource.getMessage(exception.getResourceBundleKey(), exception.getArgs()); 

     return Response.status(Response.Status.BAD_REQUEST). 
       entity(error). 
       type(MediaType.APPLICATION_JSON). 
       build(); 
    } 
} 
4

मेरे लिए चाल किया वसंत config में स्पष्ट रूप से गुंजाइश जोड़ना:

<bean id="exceptionMapper" class="my.pkg.MyExceptionMapper" scope="singleton" /> 
+1

ठीक है, यह चाल है, लेकिन इसका क्या मतलब है? क्या स्प्रिंग एक्सएमएल में डिफ़ॉल्ट रूप से सिंगलटन के रूप में परिभाषित सभी बीन्स पर विचार नहीं करता है? हमें इसे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता क्यों है? – saratbeesa

0

मुझे लगता है कि अपवाद मैपर को "गाना" के रूप में कॉन्फ़िगर करना होगा स्प्रिंग के साथ "लिटन"।मैं वसंत का उपयोग पसंद करते हैं आप (javax.inject.Singleton का एक अलग अर्थ वसंत द्वारा व्याख्या के साथ) एनोटेशन विन्यास आप क्योंकि जर्सी भी एक "@Singleton" एनोटेशन है ध्यान भुगतान किया है उपयोग करने के लिए किसी भी भ्रम से बचने के चाहते हैं @ सेवा एनोटेशन, कि एक सिंगलटन गुंजाइश का तात्पर्य ... इसलिए:

import org.springframework.stereotype.Service; 

import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 
import javax.ws.rs.ext.Provider; 

@Service //implies a singleton-scope 
@Provider 
public class UnhandledExceptionMapper implements ExceptionMapper<Throwable> { 

    @Override 
    public Response toResponse(Throwable exception) { 
     return Response.status(Response.Status.INTERNAL_SERVER_ERROR) 
       .entity(new ErrorBean(false, exception.getMessage(), null)) 
       .build(); 
    } 
} 
0

मैंने यह भी पाया कुछ समय coustom ExceptionMapper काम नहीं है, और यह हमेशा काम नहीं कर रहा है या नहीं काम करते हैं।

तो मैं जर्सी के स्रोत कोड डिबग।

वर्ग: org.glassfish.jersey.server.ServerRuntime, methed: mapException

... 
final long timestamp = tracingLogger.timestamp(ServerTraceEvent.EXCEPTION_MAPPING); 
**ExceptionMapper mapper = runtime.exceptionMappers.findMapping(throwable);** 
if (mapper != null) { 
     request.getRequestEventBuilder().setExceptionMapper(mapper); 

... अगर नक्शाकार रिक्त है, coustom ExceptionMapper काम नहीं किया जाएगा।

वर्ग: org.glassfish.jersey.internal.ExceptionMapperFactory methed: ExceptionMapperFactory

अपवाद मैपर: (वहाँ दो अपवाद मानचित्रण एक ही अपवाद: java.lang.Exception)

org.glassfish.jersey .server.mvc.internal.ErrorTemplateExceptionMapper @ 6473fc2, वर्ग java.lang.Exception

...

com.baidu.ssp.web.ws.exception.BaseExceptionMapper @ 7a84639c, वर्ग java.lang.Exception

क्योंकि यह MvcFeature में:

@Override सार्वजनिक बूलियन कॉन्फ़िगर (अंतिम FeatureContext संदर्भ) { अंतिम विन्यास config = context.getConfiguration();

if (!config.isRegistered(ErrorTemplateExceptionMapper.class)) { 
    context.register(ErrorTemplateExceptionMapper.class); 
    context.register(new MvcBinder()); 

    return true; 
} 

return false; 

} ErrorTemplateExceptionMapper भी ExceptionMapper में जोड़ने के लिए है।

तो मैं अपने कस्टम MapperException के genericity प्रकार बदलने: ExceptionMapper

को ExceptionMapper हो सकता है मेरी संकल्प आप के लिए उपयुक्त नहीं है, मुख्य समस्या ExceptionMapper

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