Ho il seguente codice:Come restituisco la risposta HTTP 404 JSON/XML in JAX-RS (Jersey) su Tomcat?
@Path("https://stackoverflow.com/users/{id}")
public class UserResource {
@Autowired
private UserDao userDao;
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public User getUser(@PathParam("id") int id) {
User user = userDao.getUserById(id);
if (user == null) {
throw new NotFoundException();
}
return user;
}
Se chiedo per un utente che non esiste, come /users/1234
, con "Accept: application/json
", questo codice restituisce un HTTP 404
risposta, come ci si aspetterebbe, ma restituisce Content-Type
set a text/html
e un messaggio corpo di html. L'annotazione @Produces
viene ignorata.
Si tratta di un problema di codice o di un problema di configurazione?
L'ho provato. Continuo a lanciare NotFoundException, ma ora associo tale eccezione utilizzando ExceptionMapper per impostare il codice di stato e il tipo di supporto. Funziona! Prima di questo ho provato a restituire una risposta equivalente, invece di lanciare NotFoundException, ma ho lo stesso risultato, una risposta 404 text/html. Questo comportamento è dovuto al fatto che se la mia app genera una NotFoundException l'eccezione (implicita) ExceptionMapper arriva e sovrascrive la risposta che ritorna alla risposta HTML? Grazie! – IJR
Dopo aver provato una soluzione diversa, questa è la soluzione migliore e corretta. Non è obbligatorio mappare * NotFoundException *. Basta usare Exception e fare ciò di cui hai bisogno – Valijon
@Provider è molto importante –