मैंने पढ़ा है कि मैं 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();
}
}
धन्यवाद-ब्लाइज, जो काम करता था। हालांकि मुझे PersistenceException में अमान्यडेटा एक्सेप्शन क्यों लपेटना चाहिए? मेरे पास मौजूद पुस्तकों में से एक के अनुसार, यह कहता है कि यदि कोई अपवाद मैपर पंजीकृत है तो जेएक्स-आरएस रनटाइम किसी भी फेंकने वाले अपवाद को संभालेगा। मेरे मामले में, मैंने अमान्यडेटा एक्सेप्शन के लिए अपवाद मैपर पंजीकृत किया है ... –
जेपीए कार्यान्वयन अमान्यडेटाएक्सप्शन को पकड़ने और इसे PersistenceException में लपेटने जा रहा है। फिर आपके जेएक्स-आरएस कार्यान्वयन को दृढ़ता प्राप्त करने जा रहा है। यही कारण है कि आपको इसे खोलने की जरूरत है। –
यह भी देखें कि http://stackoverflow.com/questions/3249495/call-exceptionmapper-from-another-exceptionmapper-in-jax-rs –