Как обрабатывать `jsonParseException` из парсера Джексона в Java - PullRequest
3 голосов
/ 21 февраля 2020

Я впервые пишу код в Java Я использую JsonParseException, когда отправляю неверные данные json в теле запроса. Я знаю, что должен поймать эту ошибку в тот момент, когда тело анализируется json. Я понятия не имею, как это работает в моем коде. Было бы замечательно, если бы кто-нибудь мог объяснить мне, как перехватить ошибку и отправить ответ 400 вместо 500, который выдается как Uncaught server error, а также как анализируется тело запроса. Кажется, я использую JAXRS: 2.0.1 и jackson для Json разбора. Я также добавилMappper для обработки этих исключений, но он не работает.

//./src/main/java/com.test.rest/Routes.java
package.com.test.rest;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
public class Routes implements Xyz{

    @POST
    @Path("test")
    @Consumes({MediaType.APPLICATION_JSON})
    @Produces(MediaType.APPLICATION_JSON)
    public Response testJson(@Context HttpHeaders headers, @HeaderParam("abc") String abc, TestRequest request){

         if(abc == null){
           return Response.status(Response.Status.BAD_REQUEST).entity("Invalid headers").build();
         }else{
           return Response.status(Response.Status.OK).entity(request.gettestData()).build();
         }
    }
}

./src/main/java/com.test.rest/TestRequest.java

package.com.test.rest;

public class TestRequest {
    private String testData;

    public TestRequest () {
    }
    public TestRequest(String testData){
        setTestData(testData);
    }

    public String gettestData(){
        return testData;
    }
    public void setTestData(String testData){
        if(testData!=null){
            testData = testData.toLowerCase();
        }
        this.testData =testData;
    }
}

./src/main/java/com.test.rest/JsonParseExceptionMapper.java

package.com.test.rest;

import com.fasterxml.jackson.core.JsonParseException;

import javax.annotation.Priority;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.core.*;

@Provider
@Priority(1)
public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException> {
    @Override
    public Response toResponse(final JsonParseException exception) {
        return Response.status(Response.Status.BAD_REQUEST)
                .entity("Cannot parse JSON")
                .type(MediaType.TEXT_PLAIN)
                .build();
    }
}

Все файлы находятся на одном уровне, и я использую gradle для создания своего кода
это мое тело запроса

{
    "testData":
}
//com.fasterxml.jackson.core.JsonParseException: Unexpected character
...