Переменная 'interface', возможно, не была инициализирована - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь создать приложение Morphia и Spring, используя шаблон из другого проекта, и получаю следующую ошибку

Variable 'assetRepository' might not have been initialized

AssetRepository - это интерфейс

package code.nithin.repository;

import code.nithin.entity.Asset;
import org.mongodb.morphia.Key;

public interface AssetRepository {
    public Key<Asset> save(Asset asset);
}

и AssetController равно

package code.nithin.controllers;

import code.nithin.entity.Asset;
import code.nithin.repository.AssetRepository;
import org.mongodb.morphia.Key;

public class AssetController{

    public String saveAsset(String URL){
        AssetRepository assetRepository;
        Asset test = new Asset(1, System.currentTimeMillis(),"https://example.com");

        String returnString = assetRepository.save(test).getId();

    }
}

Сущность

package code.nithin.entity;

import org.bson.types.ObjectId;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Entity("asset")
@NoArgsConstructor
public class Asset {

    @Id
    public ObjectId _id;

    public int version;
    public long timestamp;
    public String URL;

    public Asset(){}

    public Asset(int version, long timestamp, String URL) {
        this.version = version;
        this.timestamp = timestamp;
        this.URL = URL;
    }

    public ObjectId get_id() {
        return _id;
    }

    public void set_id(ObjectId _id) {
        this._id = _id;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    public String getURL() {
        return URL;
    }

    public void setURL(String URL) {
        this.URL = URL;
    }
}

Проект, о котором я говорю, реализует то же, что и

@Bean
public CommandLineRunner init(AssetRepository assetRepository){
    return (args) -> {
        Asset test = new Asset(1, 123456789632541 ,"https://example.com");
        System.out.println(assetRepository.save(test).getId());
    };
}

Проект, на который я ссылаюсь, не выдает ошибку.

трассировка стека

Error:(19, 28) java: variable assetRepository might not have been initialized
    Error:(21, 5) java: missing return statement
    /home/signzy/code/java/cubereum/boilerplate/src/main/java/code/cubereum/controllers/AssetController.java
    Information:javac 1.8.0_181 was used to compile java sources
    Information:1/9/18 2:58 PM - Compilation completed with 2 errors and 0 warnings in 1 s 730 ms
    Information:java: Errors occurred while compiling module 'boilerplate_main'

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Я думаю, что это происходит из этого кода:

public String saveAsset(String URL){
    AssetRepository assetRepository;
    Asset test = new Asset(1, System.currentTimeMillis(),"https://example.com");

    String returnString = assetRepository.save(test).getId();

}

У вас есть assetRepository, который не инициализирован. И тогда вы пытаетесь сделать

assetRepository.save(test).getID();

Поскольку assetRepository не инициализирован, это может быть проблемой.

EDIT: AssetRepository является интерфейсом, поэтому вы не можете инициализировать переменную assetRepository с его помощью.

Однако у вас должен быть где-то другой класс, который реализует AssetRepository и определяет метод save (актив актива). Это должно выглядеть так:

public class Foo implements AssetRepository{
    public Foo(){
        //Constructor for this class
    }

    public Key<Asset> save(Asset asset){
        //some code here
        //this defines the method declared in the Interface
    }
}

Затем, чтобы инициализировать вашу переменную, вы делаете это:

AssetRepository assetRepository = new Foo();
0 голосов
/ 01 сентября 2018

saveAsset() имеет локальный assetRepository (никогда не устанавливается), который скрывает статический глобальный.

Удалите локальную, и она должна работать.

После просмотра трассировки стека это очевидно, как я сказал выше:

public String saveAsset(String URL){
        AssetRepository assetRepository;
        Asset test = new Asset(1, System.currentTimeMillis(),"https://example.com");

        String returnString = assetRepository.save(test).getId();

    }
  1. У вас есть локальный AssetRepository, который вы никогда не устанавливали, и поэтому вы получаете «переменная assetRepository, возможно, не инициализирован»
  2. Функция возвращает строку, но у вас нет оператора return, поэтому вы получаете «пропущенный оператор возврата»

    public String saveAsset(String URL){
        Asset test = new Asset(1,  System.currentTimeMillis(),"https://example.com");
        return assetRepository.save(test).getId();
     }
    
...