创建错误条件并将它们传递回客户端

时间:2013-03-13 11:43:42

标签: java grails error-handling

在我的Grails Web应用程序中,我有一个弹出对话框,允许我输入某种类型的自然语言表达式,用于在应用程序中执行某些操作。

我目前正在groovy中实现解析器,并且想知道如何创建错误消息并将它们返回给客户端。

我正在考虑使用<g:formRemote>来使用ajax将文本字符串发送到解析器,并且在成功解析字符串后,它将在应用程序中执行操作,比如将用户添加到一个项目,通常后面是一个重定向到一个新页面,比如显示用户现在是项目的一部分。如果解析器接收到它不期望/识别的令牌,或者如果字符串没有遵循正确的语法,我就能够创建错误消息并将其发送回客户端,允许用户尝试另一个命令。

到目前为止,我的代码看起来像这样..

在我的控制器中接收ajax请求

def runTemp()
{
    def tokenizer = new Tokenizer()
    def posTagger = new PartOfSpeechTagger()

    def words = tokenizer.getTokens("add user");
    def taggedWords = posTagger.tagWords(words)

    taggedWords.each{
        println"${it.word} : ${it.partOfSpeech}"
    }       
}

和我的PartOfSpeechTagger.groovy看起来像

package uk.co.litecollab.quickCommandParser

class PartOfSpeechTagger {

def lexicons = [
    //VERBS
    'add': PartOfSpeech.VERB,
    'new': PartOfSpeech.VERB,
    'create': PartOfSpeech.VERB,
    'view': PartOfSpeech.VERB,
    'delete': PartOfSpeech.VERB,
    'logout': PartOfSpeech.VERB,
    'remove': PartOfSpeech.VERB,
    'chat': PartOfSpeech.VERB,
    'accept': PartOfSpeech.VERB,
    'active': PartOfSpeech.VERB,
    'suspend': PartOfSpeech.VERB,
    'construct': PartOfSpeech.VERB,
    'close': PartOfSpeech.VERB,
    'add': PartOfSpeech.VERB,

    //NOUNS
    'project': PartOfSpeech.NOUN,
    'user': PartOfSpeech.NOUN,
    'task': PartOfSpeech.NOUN,
    'chat': PartOfSpeech.NOUN,
    'conversation': PartOfSpeech.NOUN,

    //DETERMINERS
    'a': PartOfSpeech.DETERMINER,
    'the': PartOfSpeech.DETERMINER,

    //PREPOSITIONS
    'to': PartOfSpeech.PREPOSITION,
    'from': PartOfSpeech.PREPOSITION,
    'for': PartOfSpeech.PREPOSITION,
    'with': PartOfSpeech.PREPOSITION    
    ]


//constructor
def PartOfSpeechTagger()
{

}

def tagWords(String[] words)
{
    def taggedWords = [] as ArrayList
    words.each{
        //removing the use of 'it' due to nested closures
        println"word to search for : ${it}"
        def word = it
        if(inLexicons(word))
        {
            println"word :: ${it}"
            taggedWords.add(
                new TaggedWord(
                    lexicons.find{it.key == word}.key, 
                    lexicons.find{it.key == word}.value)
                )           
        }
        else
        {
            /* 
             * handle errors for not finding a word?
             */
        }
    }   

    return taggedWords
}

def inLexicons(key)
{
    return lexicons.containsKey(key)
}   
}

您可以在tagWords方法中看到我希望能够向客户报告所提供的字词不是预期的。

1 个答案:

答案 0 :(得分:0)

搞定了,

在控制器中

render(status: 400, text: "the message")

然后以我的远程形式

onFailure="doSomething(XMLHttpRequest)"
然后

通过

在javascript中访问它
XMLHttpRequest.responseText