2010-07-20 14 views
29

मैंने पढ़ा है कि मैं javax.ws.rs.ext.ExceptionMapper का कार्यान्वयन कर सकता हूं जो Response ऑब्जेक्ट पर एक फेंक दिया गया एप्लिकेशन अपवाद मैप करेगा।अपवाद मैपर का उपयोग कर जेएक्स-आरएस

मैंने एक साधारण उदाहरण बनाया है जो वस्तु को बनाए रखने पर फ़ोन की लंबाई 20 वर्णों से अधिक होने पर अपवाद फेंकता है। मैं अपवाद को HTTP 400 (खराब अनुरोध) प्रतिक्रिया में मैप करने की उम्मीद कर रहा हूं; हालांकि, मैं निम्न अपवादों के साथ एक HTTP 500 (आंतरिक सर्वर त्रुटि) प्राप्त कर रहा:

java.lang.ClassCastException: com.example.exception.InvalidDataException cannot be cast to java.lang.Error 

मैं क्या याद आ रही है? किसी भी सलाह की काफी सराहना की जाती है।

अपवाद नक्शाकार:

@Provider 
public class InvalidDataMapper implements ExceptionMapper<InvalidDataException> { 

    @Override 
    public Response toResponse(InvalidDataException arg0) { 
     return Response.status(Response.Status.BAD_REQUEST).build(); 
    } 

} 

अपवाद वर्ग:

public class InvalidDataException extends Exception { 

    private static final long serialVersionUID = 1L; 

    public InvalidDataException(String message) { 
     super(message); 
    } 

    ... 

} 

इकाई वर्ग:

@Entity 
@Table(name="PERSON") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
public class Person { 

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="ID") 
    private Long id; 

    @Column(name="NAME") 
    private String name; 

    @Column(name="PHONE") 
    private String phone; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getPhone() { 
     return phone; 
    } 

    public void setPhone(String phone) { 
     this.phone = phone; 
    } 

    @PrePersist 
    public void validate() throws InvalidDataException { 
     if (phone != null) { 
      if (phone.length() > 20) { 
       throw new InvalidDataException("Phone number too long: " + phone); 
      } 
     }  
    } 
} 

सेवा:

@Path("persons/") 
@Produces(MediaType.APPLICATION_XML) 
@Consumes(MediaType.APPLICATION_XML) 
@Stateless 
public class PersonResource { 

    @Context 
    private UriInfo uriInfo; 

    @PersistenceContext(name="simple") 
    private EntityManager em; 

    @POST 
    public Response createPerson(JAXBElement<Person> personJaxb) { 
     Person person = personJaxb.getValue(); 
     em.persist(person); 
     em.flush(); 
     URI personUri = uriInfo.getAbsolutePathBuilder(). 
     path(person.getId().toString()).build(); 
     return Response.created(personUri).build(); 
    } 

} 

उत्तर

31

क्या अमान्यडेटा एक्सेप्शन एक पर्सिस्टेंस अपवाद में लपेटा जा रहा है? हो सकता है कि आप निम्नलिखित की तरह कुछ कर सकता है:

@Provider 
public class PersistenceMapper implements ExceptionMapper<PersistenceException> { 

    @Override 
    public Response toResponse(PersistenceException arg0) { 
     if(arg0.getCause() instanceof InvalidDataException) { 
      return Response.status(Response.Status.BAD_REQUEST).build(); 
     } else { 
      ... 
     } 
    } 

} 
+2

धन्यवाद-ब्लाइज, जो काम करता था। हालांकि मुझे PersistenceException में अमान्यडेटा एक्सेप्शन क्यों लपेटना चाहिए? मेरे पास मौजूद पुस्तकों में से एक के अनुसार, यह कहता है कि यदि कोई अपवाद मैपर पंजीकृत है तो जेएक्स-आरएस रनटाइम किसी भी फेंकने वाले अपवाद को संभालेगा। मेरे मामले में, मैंने अमान्यडेटा एक्सेप्शन के लिए अपवाद मैपर पंजीकृत किया है ... –

+4

जेपीए कार्यान्वयन अमान्यडेटाएक्सप्शन को पकड़ने और इसे PersistenceException में लपेटने जा रहा है। फिर आपके जेएक्स-आरएस कार्यान्वयन को दृढ़ता प्राप्त करने जा रहा है। यही कारण है कि आपको इसे खोलने की जरूरत है। –

+0

यह भी देखें कि http://stackoverflow.com/questions/3249495/call-exceptionmapper-from-another-exceptionmapper-in-jax-rs –

-1

क्रॉस चेक आप web.xml आप सेवाओं के साथ अपने "PersistenceMapper" वर्ग भी रजिस्टर करने के लिए की जरूरत है।

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