Как вернуть строку в ответ, которая имеет @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://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-en/cn/part1/chapter7/exception_handling.html

В частности, для Джерси: https://howtodoinjava.com/jersey/jax-rs-jersey-custom-exceptions-handling-with-exceptionmapper/

Другие вопросы по тегам