Исключение NullPointer для параллельных запросов

Может кто-нибудь сказать мне, что не так с этим кодом

Я получаю исключение нулевого указателя, и я предполагаю, что из-за нескольких запросов

@Service
public class GernericMockingServiceImpl implements GenericMockingService {

    private static final Logger LOG = LoggerFactory.getLogger(GernericMockingServiceImpl.class);

    @Override
    public String getJsonResponse(GenericMockingForm genericMockingForm, String requestURI) throws Exception {
        LOG.info("printing requestURI : "+requestURI);
        String path = new URI(requestURI).getPath();
        //resolves to a folder name in src/main/resources
        String folderName = path.substring(path.lastIndexOf('/') + 1);
        LOG.info("printing folderName : " + folderName);
        String jsonResponse = null;
        StringBuilder sb = new StringBuilder();

        //check if the request body has prodcut id's which means that the request is for products else check for sku's which means that the request is for price or stock
        if (!Objects.isNull(genericMockingForm.getProductIds()) && !genericMockingForm.getProductIds().isEmpty()){
            //currently it iterates over all the product id's/sku's in the request and appends the content of all the id's
            //TODO: the content of the file is not exactly how we want it to be for multiple ids' But for the single id it just works.
            // TODO: Needs to be refactored later when we handle multiple id's in request
            for(String productId : genericMockingForm.getProductIds()){
                jsonResponse = getJson(folderName, productId, sb);
            }
        }else{
            for (String sku : genericMockingForm.getSkus()) {
                jsonResponse = getJson(folderName, sku, sb);
            }
        }
        LOG.info("printing jsonResponse : " + jsonResponse);
        return jsonResponse;
    }

    private String getJson(String folderName, String id, StringBuilder sb) throws Exception {
        String responseJson = null;
        String filePath = "data" + File.separator + folderName + File.separator + id + ".json";
        LOG.info("printing filePath : " + filePath);
        LOG.info("printing id : " + id);
        File f = new File(filePath);
        if (f.exists()){
            try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath)) {
                LOG.info("printing inputStream : " + inputStream);
                if (inputStream != null) {
                    responseJson = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name());
                }
                if (responseJson == null || responseJson.isEmpty()) {
                    LOG.info("json response is null : ");
                    throw new JsonNotFoundException(Constant.JSON_NOT_FOUND);   
                }
                sb.append(responseJson);
            } catch (IOException e) {
                LOG.info("IO exception : ");
                throw new IOException(e);
            } catch (Exception e) {
                LOG.info(" exception : ");
                throw new Exception(e);
            }
        }
        else{
            LOG.info("file doesnt exists : " + filePath);
        }
        return sb.toString();
    }
}

** У меня есть 3 параллельных запроса на доступ к папке с 3 разными файлами и попытка чтения из файлов

Это моя трассировка стека**

  2019-03-05 17:30:29.335  INFO 82 --- [nio-8080-exec-1] c.k.m.controller.ProductController       : Received request for Mocking Controller
    2019-03-05 17:30:29.335  INFO 82 --- [nio-8080-exec-3] c.k.m.controller.ProductController       : Received request for Mocking Controller
    2019-03-05 17:30:29.335  INFO 82 --- [nio-8080-exec-2] c.k.m.controller.ProductController       : Received request for Mocking Controller
    2019-03-05 17:30:29.336  INFO 82 --- [nio-8080-exec-2] c.k.m.s.impl.GernericMockingServiceImpl  : printing requestURI : /mocking/api/stocks
    2019-03-05 17:30:29.336  INFO 82 --- [nio-8080-exec-3] c.k.m.s.impl.GernericMockingServiceImpl  : printing requestURI : /mocking/get-products
    2019-03-05 17:30:29.337  INFO 82 --- [nio-8080-exec-3] c.k.m.s.impl.GernericMockingServiceImpl  : printing folderName : get-products
    2019-03-05 17:30:29.338  INFO 82 --- [nio-8080-exec-3] c.k.m.s.impl.GernericMockingServiceImpl  : printing filePath : data/get-products/1610-17637-319.json
    2019-03-05 17:30:29.338  INFO 82 --- [nio-8080-exec-3] c.k.m.s.impl.GernericMockingServiceImpl  : printing id : 1610-17637-319
    2019-03-05 17:30:29.338  INFO 82 --- [nio-8080-exec-3] c.k.m.s.impl.GernericMockingServiceImpl  : file doesnt exists : data/get-products/1610-17637-319.json
    2019-03-05 17:30:29.338  INFO 82 --- [nio-8080-exec-3] c.k.m.s.impl.GernericMockingServiceImpl  : printing jsonResponse : 
    2019-03-05 17:30:29.336  INFO 82 --- [nio-8080-exec-1] c.k.m.s.impl.GernericMockingServiceImpl  : printing requestURI : /mocking/api/prices
    2019-03-05 17:30:29.338  INFO 82 --- [nio-8080-exec-1] c.k.m.s.impl.GernericMockingServiceImpl  : printing folderName : prices
    2019-03-05 17:30:29.337  INFO 82 --- [nio-8080-exec-2] c.k.m.s.impl.GernericMockingServiceImpl  : printing folderName : stocks
    2019-03-05 17:30:29.343  INFO 82 --- [nio-8080-exec-2] c.k.m.s.impl.GernericMockingServiceImpl  : printing filePath : data/stocks/1610-17637.json
    2019-03-05 17:30:29.343  INFO 82 --- [nio-8080-exec-2] c.k.m.s.impl.GernericMockingServiceImpl  : printing id : 1610-17637
    2019-03-05 17:30:29.343  INFO 82 --- [nio-8080-exec-2] c.k.m.s.impl.GernericMockingServiceImpl  : file doesnt exists : data/stocks/1610-17637.json
    2019-03-05 17:30:29.343  INFO 82 --- [nio-8080-exec-2] c.k.m.s.impl.GernericMockingServiceImpl  : printing jsonResponse : 
    2019-03-05 17:30:29.354 ERROR 82 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

    java.lang.NullPointerException: null
        at com.kfz24.mockingservice.service.impl.GernericMockingServiceImpl.getJsonResponse(GernericMockingServiceImpl.java:45) ~[classes/:na]
        at com.kfz24.mockingservice.controller.GenericMockingController.processRequest(GenericMockingController.java:32) ~[classes/:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        **at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) ~[spring-webmvc-5.1.4.RELEASE.jar:5.1.4.RELEASE]**

Можете ли вы сказать нам строку, в которой возникает исключение... или вы можете сказать нам, какая строка является этой GernericMockingServiceImpl.java:45 в вашем коде.

pL4Gu33 05.03.2019 18:57

это строка для (String sku: genericMockingForm.getSkus()) {

Vinaya Nayak 05.03.2019 19:06

В основном первый запрос проверяет Objects.isNull(genericMockingForm.getProductIds()) && !genericMockingForm.getProductIds().isEmpty(), а затем другой запрос параллельно проверяет блок else

Vinaya Nayak 05.03.2019 19:09

И это не происходит только с одним запросом? В основном похоже, что значение, возвращаемое getSkus(), равно нулю. Это приведет к сбою цикла for.

dpr 05.03.2019 19:28

genericMockingForm может иметь либо productId, либо sku в любой момент времени, но не может иметь оба

Vinaya Nayak 05.03.2019 19:32

/get-pruducts имеет productId, а /api/skus — артикул. и эти вызовы API происходят параллельно

Vinaya Nayak 05.03.2019 19:35

Также я не знаю, следует ли синхронизировать какой-либо блок кода

Vinaya Nayak 06.03.2019 10:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
188
1

Ответы 1

I get null pointer exception and I assume because of the multiple requests

Я думаю, что ваше предположение неверно.

[From comments: the null is ] this line for (String sku : genericMockingForm.getSkus()) {

Кажется, это указывает на то, что genericMockingForm.getSkus() возвращает null, поскольку единственный другой используемый объект — это genericMockingForm, который проверен выше.

Вы должны поставить ту же нулевую проверку на этот тест формы:

 if (!Objects.isNull(genericMockingForm.getSkus())) ...

Если они оба null, вы должны выдать какую-то ошибку использования.

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