Как вернуть строку в ответ, которая имеет @Produces(MediaType.APPLICATION_JSON)?
@GET
@Path("/paises/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response findCuntryList(@PathParam("id")int id){
try{
ArrayList<Country> lista = new ArrayList<>();
for(int i=0; i<10 ;i++){
Country c = new Country();
c.setId(i);
c.setName("country"+i);
c.setCode("countryIsoCode"+i);
c.setRegion("region"+i);
lista.add(c);
}
Country co = lista.stream().filter(x -> x.getId()==id).findAny().get();
if(id > lista.size()-1) throw new Exception("That id is not correct");
return Response.ok(co).build();
}catch(Exception e){
return Response.status(404).entity(e.getMessage()).build();
}
}
Я хочу вернуть json, когда у меня нет Исключения, но когда у меня есть это, мне нужно вернуть строку с сообщением об исключении, но это ошибка сброса при разборе json.
3 ответа
Строка в одинарных кавычках является допустимым JSON. Таким образом, вы можете использовать:
return Response.status(404).entity("\"" + e.getMessage() + "\"").build();
Однако я советую вам возвращать объект JSON. Это дает вам возможность возвращать дополнительные метаданные об ошибке.
Вы могли бы использовать Map<String, Object>
:
Map<String, Object> errorDetails = new HashMap<>();
errorDetails.put("message", e.getMessage());
return Response.status(404).entity(errorDetails).build();
Или создайте класс для деталей ошибки:
public class ErrorDetails {
private String message;
...
}
ErrorDetails errorDetails = new ErrorDetails;
errorDetails.setMessage(e.getMessage());
return Response.status(404).entity(errorDetails).build();
Для сообщения о проблемах в HTTP API, посмотрите RFC 7807.
Почему вы не заинтересованы использовать выражение WILDCARD, как,
@Path("getSupportEmail/{broadcastMprId}")
@GET
@Produces(MediaType.MEDIA_TYPE_WILDCARD)
public Response getSupportEmailByBroadcastMprId(@PathParam("broadcastMprId") Integer broadcastMprId) {
return Response.ok(broadcastMprBean.getSupportEmailByBroadcastMprId(broadcastMprId)).build();
}
Исходя из предоставленного вами примера кода и тегов для этого вопроса, вам, вероятно, лучше использовать обработчик исключений, а не перехватывать и возвращать сообщение, созданное вручную, и разрешать @GET
метод возврата вашего доменного объекта. Библиотека JAX-RS (в данном случае Джерси?) Будет сериализовать ее в JSON, поскольку ваш метод аннотирован с помощью APPLICATION_JSON.
В частности, для Джерси: https://howtodoinjava.com/jersey/jax-rs-jersey-custom-exceptions-handling-with-exceptionmapper/