JAX-RS à l'aide d'exception mappeurs
J'ai lu que je peux créer une mise en œuvre de javax.ws.rs.ext.ExceptionMapper
qui carte la levée d'une exception d'application à un Response
objet.
J'ai créé un exemple simple qui lève une exception si le téléphone de la longueur est supérieure à 20 caractères lors de la persistance de l'objet. Je m'attends à ce que l'exception à être mappé à une HTTP 400 (Bad Request) réponse; cependant, je reçois un HTTP 500 (Internal Server Error) avec l'exception suivante:
java.lang.ClassCastException: com.example.exception.InvalidDataException cannot be cast to java.lang.Error
Ce qui me manque? Tout conseil est le bienvenu.
Exception mappeur:
@Provider
public class InvalidDataMapper implements ExceptionMapper<InvalidDataException> {
@Override
public Response toResponse(InvalidDataException arg0) {
return Response.status(Response.Status.BAD_REQUEST).build();
}
}
Classe d'Exception:
public class InvalidDataException extends Exception {
private static final long serialVersionUID = 1L;
public InvalidDataException(String message) {
super(message);
}
...
}
Classe d'entité:
@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);
}
}
}
}
Service:
@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();
}
}
Vous devez vous connecter pour publier un commentaire.
Est InvalidDataException obtenir enveloppé dans un PersistenceException? Peut-être que vous pourriez faire quelque chose comme ce qui suit:
else
déclaration dépend de votre application. En fin de compte, vous pouvez construire différents types deResponse
des objets en se basant sur les différents types d'exceptions imbriquées.InvalidDataException
obtenir enveloppé dans unPersistenceException
?Croix de vérifier si vous web.xml vous devez enregistrer votre "PersistenceMapper" class également avec les services.