[英]Unsatisfied dependency expressed through field 'sv'
package org.citi.sentimentapi;
@RestController
public class SentimentController{
@Autowired
private SentimentService sv;
@RequestMapping("/sentiment/{text}")
public double apply(@PathVariable String text) throws Exception {
return sv.apply(text);
}
}
The below exception is coming: 以下异常即将到来:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sentimentController': Unsatisfied dependency expressed through field 'sv'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sentimentService' defined in file [C:\Users\MG23625\Desktop\workspace\sentiment-apiImproved\target\classes\org\citi\sentimentapi\SentimentService.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.citi.sentimentapi.SentimentService]: Constructor threw exception; nested exception is java.lang.NullPointerException: in must not be null
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.citi.sentimentapi.Sentiment.main(Sentiment.java:11) [classes/:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sentimentService' defined in file [C:\Users\MG23625\Desktop\workspace\sentiment-apiImproved\target\classes\org\citi\sentimentapi\SentimentService.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.citi.sentimentapi.SentimentService]: Constructor threw exception; nested exception is java.lang.NullPointerException: in must not be null
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1155) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1099) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
... 19 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.citi.sentimentapi.SentimentService]: Constructor threw exception; nested exception is java.lang.NullPointerException: in must not be null
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1147) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
... 30 common frames omitted
Caused by: java.lang.NullPointerException: in must not be null
at java.util.Objects.requireNonNull(Objects.java:228) ~[na:1.8.0_121]
at opennlp.tools.util.model.BaseModel.loadModel(BaseModel.java:194) ~[opennlp-tools-1.7.2.jar:1.7.2]
at opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:173) ~[opennlp-tools-1.7.2.jar:1.7.2]
at opennlp.tools.postag.POSModel.<init>(POSModel.java:82) ~[opennlp-tools-1.7.2.jar:1.7.2]
at org.citi.sentimentapi.SentimentService$POSTagger.<init>(SentimentService.java:120) ~[classes/:na]
at org.citi.sentimentapi.SentimentService$SentimentAnalyzer.<init>(SentimentService.java:289) ~[classes/:na]
at org.citi.sentimentapi.SentimentService.<init>(SentimentService.java:388) ~[classes/:na]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_121]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_121]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_121]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_121]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]
... 32 common frames omitted
My code: 我的代码:
package org.citi.sentimentapi;
@Service
public class SentimentService {
class Word
{
public Word(String word, String pennTag)
{
if (word == null || word.isEmpty())
throw new IllegalArgumentException("word");
if (pennTag == null || pennTag.isEmpty())
throw new IllegalArgumentException("posTagInfo");
this.word = word.toLowerCase();
this.pennTag = pennTag.toUpperCase();
tag = fromPennTreebankTag(pennTag);
}
private String word;
public String getWord() {return word;}
private String pennTag;
public String getPennTag() {return pennTag;}
private String tag;
public String getTag() {return tag;}
public boolean hasTag() {return tag != null;}
String fromPennTreebankTag(String value)
{
return
value.startsWith("J") ? "a" :
value.startsWith("V") ? "v" :
value.startsWith("N") ? "n" :
value.startsWith("R") ? "r" : null;
}
@Override
public String toString()
{
return hasTag() ? word + ":" + tag : word;
}
}
abstract class Phrase
{
public Phrase(Word[] words)
{
if (words.length == 0)
throw new IllegalArgumentException();
this.words = words;
}
private Word[] words;
public Word[] getWords() {return words;}
public abstract double modifyScore(double value);
}
class Incrementer extends Phrase
{
public Incrementer(Word... words) {super(words);}
@Override
public double modifyScore(double value) {return value * 2;}
}
class Inverter extends Phrase
{
public Inverter(Word... words) {super(words);}
@Override
public double modifyScore(double value) {return value * -1;}
}
class Decrementer extends Phrase
{
public Decrementer(Word... words) {super(words);}
@Override
public double modifyScore(double value) {return value / 2;}
}
class POSTagger
{
POSTaggerME posTagger;
Tokenizer tokenizer;
SentenceDetectorME sentDetector;
public POSTagger() throws IOException
{
ClassLoader loader = getClass().getClassLoader();
//ClassLoader loader = Thread.currentThread().getContextClassLoader();
posTagger = new POSTaggerME(
new POSModel(loader.getResourceAsStream("en-pos-maxent.bin")));
tokenizer = new TokenizerME(
new TokenizerModel(loader.getResourceAsStream("en-token.bin")));
sentDetector = new SentenceDetectorME(
new SentenceModel(loader.getResourceAsStream("en-sent.bin")));
}
public Word[][] tag(String input)
{
String[] sents = sentDetector.sentDetect(input);
Word[][] res = new Word[sents.length][];
for (int i = 0; i < sents.length; i++)
{
String[] words = tokenizer.tokenize(sents[i]);
String[] tags = posTagger.tag(words);
Word[] sentence = new Word[words.length];
for (int j = 0; j < words.length; j++)
sentence[j] = new Word(words[j], tags[j]);
res[i] = sentence;
}
return res;
}
}
class WordNetLemmatizer
{
Dictionary dictionary;
public WordNetLemmatizer() throws JWNLException
{
//dictionary = Dictionary.getDefaultResourceInstance();
}
public Word getLemmatized(Word word) throws JWNLException
{
if (!word.hasTag())
return word;
IndexWord iw = dictionary.lookupIndexWord(POS.getPOSForKey(word.getTag()), word.getWord());
if (iw == null)
return word;
String lemma = iw.getLemma();
if (lemma == null || lemma.isEmpty())
return word;
return new Word(lemma, word.getPennTag());
}
}
abstract class SentimentDictionary
{
abstract double getScore(Word word);
}
class SentiWordNet extends SentimentDictionary
{
String path = "C:\\Users\\MG23625\\Downloads\\SentiWordNet_3.0.0\\home\\swn\\www\\admin\\dump\\SentiWordNet_3.0.0_20130122.txt";
Map<String, Double> dictionary;
public SentiWordNet() throws IOException
{
// This is our main dictionary representation
dictionary = new HashMap<>();
// From String to list of doubles.
HashMap<String, HashMap<Integer, Double>> tempDictionary = new HashMap<>();
try (BufferedReader csv = new BufferedReader(new FileReader(path)))
{
int lineNumber = 0;
String line;
while ((line = csv.readLine()) != null)
{
lineNumber++;
// If it's a comment, skip this line.
if (!line.trim().startsWith("#"))
{
// We use tab separation
String[] data = line.split("\t");
String wordTypeMarker = data[0];
// Example line:
// POS ID PosS NegS SynsetTerm#sensenumber Desc
// a 00009618 0.5 0.25 spartan#4 austere#3 ascetical#2
// ascetic#2 practicing great self-denial;...etc
// Is it a valid line? Otherwise, through exception.
if (data.length != 6)
{
throw new IllegalArgumentException(
"Incorrect tabulation format in file, line: " + lineNumber);
}
// Calculate synset score as score = PosS - NegS
Double synsetScore =
Double.parseDouble(data[2]) - Double.parseDouble(data[3]);
// Get all Synset terms
String[] synTermsSplit = data[4].split(" ");
// Go through all terms of current synset.
for (String synTermSplit : synTermsSplit)
{
// Get synterm and synterm rank
String[] synTermAndRank = synTermSplit.split("#");
String synTerm = synTermAndRank[0] + "#" + wordTypeMarker;
int synTermRank = Integer.parseInt(synTermAndRank[1]);
// What we get here is a map of the type:
// term -> {score of synset#1, score of synset#2...}
// Add map to term if it doesn't have one
if (!tempDictionary.containsKey(synTerm))
tempDictionary.put(synTerm, new HashMap<Integer, Double>());
// Add synset link to synterm
tempDictionary.get(synTerm).put(synTermRank, synsetScore);
}
}
}
// Go through all the terms.
for (Map.Entry<String, HashMap<Integer, Double>> entry : tempDictionary.entrySet())
{
String word = entry.getKey();
Map<Integer, Double> synSetScoreMap = entry.getValue();
// Calculate weighted average. Weigh the synsets according to
// their rank.
// Score= 1/2*first + 1/3*second + 1/4*third ..... etc.
// Sum = 1/1 + 1/2 + 1/3 ...
double score = 0.0;
double sum = 0.0;
for (Map.Entry<Integer, Double> setScore : synSetScoreMap.entrySet())
{
score += setScore.getValue() / (double) setScore.getKey();
sum += 1.0 / (double) setScore.getKey();
}
score /= sum;
dictionary.put(word, score);
}
}
}
@Override
public double getScore(Word word)
{
if (!word.hasTag())
return Double.NaN;
return dictionary.getOrDefault(word.getWord() + "#" + word.getTag(), Double.NaN);
}
}
class SentimentAnalyzer
{
Map<String, Phrase> phrases;
POSTagger posTagger;
WordNetLemmatizer lemmatizer;
SentimentDictionary sentimentDict;
public SentimentAnalyzer(SentimentDictionary dictionary) throws JWNLException, IOException
{
lemmatizer = new WordNetLemmatizer();
posTagger = new POSTagger();
sentimentDict = dictionary;
phrases = new HashMap<>();
addPhrase(new Inverter(new Word("lack", "NN"), new Word("of", "IN")));
addPhrase(new Inverter(new Word("not", "RB")));
addPhrase(new Inverter(new Word("n't", "RB")));
addPhrase(new Incrementer(new Word("too", "RB")));
addPhrase(new Incrementer(new Word("very", "RB")));
addPhrase(new Incrementer(new Word("sorely", "RB")));
addPhrase(new Decrementer(new Word("barely", "RB")));
addPhrase(new Decrementer(new Word("little", "RB")));
}
void addPhrase(Phrase value) throws JWNLException
{
phrases.put(value.getWords()[0].getWord(), value);
}
public double getScore(String input) throws JWNLException
{
double totalScore = 0;
Word[][] sentences = posTagger.tag(input);
for (Word[] sentence : sentences)
{
for (int i = 0; i < sentence.length; i++)
{
Word word = sentence[i];
Phrase p = phrases.get(word.getWord());
Phrase phrase = null;
if (p != null &&
sentence.length - i > p.getWords().length &&
containsPhrase(sentence, i, p.getWords()))
{
phrase = p;
i += phrase.getWords().length;
int j = i;
for (; j < sentence.length && !sentence[j].hasTag(); j++) ;
if (j == sentence.length)
continue;
word = sentence[j];
}
else if (!word.hasTag())
continue;
double score = sentimentDict.getScore(word);
if (Double.isNaN(score))
{
word = lemmatizer.getLemmatized(word);
score = sentimentDict.getScore(word);
}
if (!Double.isNaN(score))
{
if (phrase != null)
{
score = phrase.modifyScore(score);
//out.format("<%s> ", String.join(" ",
// stream(phrase.getWords()).map(Word::toString).toArray(String[]::new)));
}
//out.format("%s:%.2f ", word, score);
totalScore += score;
}
else
{
//out.format("%s ", word);
}
}
//out.println();
}
return totalScore;
}
boolean containsPhrase(Word[] sentence, int index, Word[] phrase)
{
if (phrase.length == 0 ||
index >= sentence.length ||
sentence.length - index < phrase.length)
{return false;}
for (int pi = 0, si = index; pi < phrase.length; pi++, si++)
{
if (sentence[si].getWord().compareTo(phrase[pi].getWord()) != 0 ||
sentence[si].getPennTag().compareTo(phrase[pi].getPennTag()) != 0)
{return false;}
}
return true;
}
}
public SentimentService() throws Exception
{
if (analyzer == null)
analyzer = new SentimentAnalyzer(new SentiWordNet());
//setCacheable(true);
}
static SentimentAnalyzer analyzer;
public double apply(String input) throws Exception
{
double score = analyzer.getScore(input);
return score;
}
}
I commented setCacheable(true) as it was giving an error. 我评论了setCacheable(true),因为它给出了错误。 Can somebody help? 有人可以帮忙吗?
You got NPE in constructor of POSTagger
at line 120. 您在第120行的POSTagger
构造函数中获得了NPE。
Caused by: java.lang.NullPointerException: in must not be null
at java.util.Objects.requireNonNull(Objects.java:228) ~[na:1.8.0_121]
at opennlp.tools.util.model.BaseModel.loadModel(BaseModel.java:194) ~[opennlp-tools-1.7.2.jar:1.7.2]
at opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:173) ~[opennlp-tools-1.7.2.jar:1.7.2]
at opennlp.tools.postag.POSModel.<init>(POSModel.java:82) ~[opennlp-tools-1.7.2.jar:1.7.2]
at org.citi.sentimentapi.SentimentService$POSTagger.<init>(SentimentService.java:120) ~[classes/:na]
at org.citi.sentimentapi.SentimentService$SentimentAnalyzer.<init>(SentimentService.java:289) ~[classes/:na]
On how to do it check What is a NullPointerException, and how do I fix it? 有关如何执行的操作,请检查什么是NullPointerException,以及如何解决它?
But honestly, you better refactor your code, or you will have plenty of such "untracable" exceptions ins the future as it is super messy. 但老实说,您最好重构代码,否则将来会出现很多此类“无法描述的”异常,因为它太乱了。
Start by moving classes to separate java
files. 首先将类移动到单独的java
文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.