GVKun编程网logo

struts2整合json出现no result type defined for type ''json''的解决方法(struts2 json result类型)

23

如果您想了解struts2整合json出现noresulttypedefinedfortype''json''的解决方法的相关知识,那么本文是一篇不可错过的文章,我们将对struts2jsonresu

如果您想了解struts2整合json出现no result type defined for type ''json''的解决方法的相关知识,那么本文是一篇不可错过的文章,我们将对struts2 json result类型进行全面详尽的解释,并且为您提供关于Ajax.Utility.RegisterTypeForAjax(typeof(_Default)) 的使用、AttributeError: 'NoneType' 对象在 request_json、beautifulsoup 标签元素内容() strip() 方法抛出 TypeError: Nonetype 不可调用、com.fasterxml.jackson.annotation.JsonSubTypes.Type的实例源码的有价值的信息。

本文目录一览:

struts2整合json出现no result type defined for type ''json''的解决方法(struts2 json result类型)

struts2整合json出现no result type defined for type ''json''的解决方法(struts2 json result类型)

struts2的json plugin可以实现struts2和json的完美结合,由于本篇主要是介绍整合过程中遇到的问题,所以编程实现的方法这里就不重复了,具体可以参看struts2的官方文档:http://struts.apache.org/2.2.1.1/docs/json-plugin.html。

我在struts.xml中有如下action定义:

<action name="product_group"method="getGroups">
    <result type="json">
        <param name="root">groupList</param>
    </result>
</action>



在上面的定义中,action的result的type为json,json plugin就可将action中定义为groupList的field自动转换为json格式数据,并返回给前端UI。

但在deploy后,启动tomcat时却报了There is no result type defined for type ''json'' mapped with name ''success''. Did you mean ''json''?的错误,因为struts2找不到json这个result type的定义。解决方法有下面两种:

1.将当前package的extends属性改为"json-default",即让当前package从josn-default继承而不是struts-default继承;

2.但如果当前package确实无法继承"json-default"的话,还可以在当前package中定义result-type,将json给加进去,如下:

<result-types>
    <result-type name="json"/>
</result-types>



两种方法的原理:

json这个result type是在json-default  (struts2-json-plugin-2.1.8.1.jar\struts-plugin.xml)里面定义的,内容如下(省去了xml和doctype标签):

<struts>
    <package name="json-default" extends="struts-default">
        <result-types>
            <result-type name="json"/>
        </result-types>
        <interceptors>
            <interceptor name="json"/>
        </interceptors>
    </package>
</struts>



可见,name为"json"的result type是在json-default中定义的,所以,从json-default继承就可以使用json这个result。另外json-default还定义了一个name为"json"的interceptor。

另外,依json-default的定义来看,方法2中还应该再加一个json的interceptor定义才比较合适。

Ajax.Utility.RegisterTypeForAjax(typeof(_Default)) 的使用

Ajax.Utility.RegisterTypeForAjax(typeof(_Default)) 的使用

原文 http://www.bubuko.com/infodetail-225288.html

 

语句的作用:页面注册方法的作用。

Ajax.Utility.RegisterTypeForAjax(typeof(命名空间.类名));

首先要在配置文件里配置

<httpHandlers>
   <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory,Ajax" />
</httpHandlers>

代码演示:

namespace WebSite
{
    public partial class tuangou : System.Web.UI.Page
    {

        protected void Page_Load(object sender,EventArgs e)
        {
            //注册
            Ajax.Utility.RegisterTypeForAjax(typeof(tuangou));
        }

        [AjaxMethod(Ajax.HttpSessionStateRequirement.ReadWrite)]
        public void delcookie()
        {
            var backurl = string.Empty;
            string url = HttpContext.Current.Request.QueryString["backurl"];
            HttpCookie cookie = HttpContext.Current.Response.Cookies["curdnt"];
            if (cookie != null)
            {
                DateTime dt = DateTime.Now;
                cookie.Expires = dt.AddDays(-1);

            }
        }

    }
}

前台使用后台的方法:

$(function () {

tuangou.delcookie();
 
});

下面演示复杂一点的下拉列表例子:

用于链接两个 DropDownList 的两种传统方法。当选定的索引更改时,返回页;或者将所有可能的数据加载到 JavaScript 数组并动态显示。希望您可以看到 AJAX 如何替代这两种解决方案。

首先,让我们来看一下我们的数据界面,并从该数据界面驱动示例。我们的数据访问层将提供两种方法:第一种方法将检索系统支持的国家/地区的列表,第二种方法将获取国家/地区 ID 并返回州/省的列表。由于这是纯数据访问,因此我们只需要使用方法。

//C#
public static DataTable GetShippingCountries();
public static DataView GetCountryStates(int countryId);

现在,让我们转到相反面,创建简单的 Web 窗体。

<asp:DropDownList ID="countries" Runat="server" />
<asp:DropDownList ID="states" Runat="server" />
<asp:Button ID="submit" Runat="server" Text="Submit" />

Page_Load 事件同样简单,和前述的 Web 窗体一样。我们使用数据访问层来检索可用的国家/地区,并将其绑定到countriesDropDownList 中。

public class Sample :System.Web.UI.Page
{
    private void Page_Load(object sender,System.EventArgs e)
   {
         //注册我们感兴趣的包含服务器端函数的类
        Ajax.Utility.RegisterTypeForAjax(typeof(Sample));
        if (!Page.IsPostBack)
        {
            countries.DataSource = DAL.GetShippingCountries();
            countries.DataTextField = "Country";
            countries.DataValueField = "Id";
            countries.DataBind();
            countries.Items.Insert(0,new ListItem("Please Select","0"));
            }
   }

    [Ajax.AjaxMethod()]
    public DataView GetStates(int countryId )
    {
        Return DAL.GetCountryStates(countryId);
    }
}                        

我们已基本完成;剩余的就是从 JavaScript 调用 GetStates 方法和处理响应。当用户从国家/地区列表中选择新项时,我们想在逻辑上调用 GetStates。为此,我们将触发 JavaScript onChange 事件。这样就稍微更改了我们的 Web 窗体代码。

<asp:DropDownList onChange="LoadStates(this)" 
ID="countries" Runat="server" />

JavaScript LoadStates 函数将负责通过由 Ajax.NET 创建的代理发出异步请求。请记住,默认情况下,Ajax.NET 创建的代理的格式为 <RegisteredTypeName>.<ServerSideMethodName>。在我们的示例中,将为Sample.GetStates。我们还想传入国家/地区 ID 参数和完成服务器端函数后 Ajax.NET 应调用的回调函数。

//JavaScript
function LoadStates(countries)
{
  var countryId = countries.options[countries.selectedindex].value;
  Sample.GetStates(countryId,LoadStates_CallBack);
}

最后一个步骤是处理我们的 LoadStates_CallBack 函数中的响应。Ajax.NET 最有用的功能大概是它支持很多 .NET 类型(我已经多次提到这一点)。回顾一下返回 DataView 的服务端函数。JavaScript 知道 DataView 什么?什么也不知道,但是 JavaScript 是面向对象的语言,而且 Ajax.NET 不只能够创建与 .NET DataView 相似的对象,还能将该函数返回的值映射到 JavaScript 副本。您应该记住 JavaScript DataView 只不过是实际 DataView 的副本,目前除了能够遍历行和访问列值以外不支持其他更多功能(例如设置 RowFilter 或 Sort 属性的功能)。

function LoadStates_CallBack(response)
{
  //如果服务器端代码出现异常
  if (response.error != null)
   {
    //我们应该能做得更好
    alert(response.error); 
    return;
   }
  var states = response.value;
  //如果不是我们所希望的响应
  if (states == null || typeof(states) != "object")
   {
    return;
   }
  //获得州下拉列表
  var statesList = document.getElementById("states");
  statesList.options.length = 0; //重置州下拉列表
  //记住,其长度不是 JavaScript 中的 Length
  for (var i = 0; i < states.length; ++i)
   {
    //如命名属性一样公开行的列
    statesList.options[statesList.options.length] =
    new Option(states[i].State,states[i].Id);
   }
}

经过一些错误检查之后,前面的 JavaScript 获得州下拉列表,遍历响应的值,并动态地将选项添加到该下拉列表中。代码清晰、简单并与 C# 和 Visual Basic .NET 非常相似。就我个人而言(作为基于服务器端变量创建了 JavaScript 数组并将它们链接在一起的开发人员),我还要一段时间才能相信它真的起作用了。

有一个可能不太明显的主要问题。由于 DropDownList 是在 JavaScript 中动态创建的,因此它的项不属于ViewState,并且不被维护。这意味着按钮的 OnClick 事件处理程序需要进行一些额外的修改。

AttributeError: 'NoneType' 对象在 request_json

AttributeError: 'NoneType' 对象在 request_json

如何解决AttributeError: ''NoneType'' 对象在 request_json?

我有一个 Python 应用程序:

ma​​in.py

import os
import logging
import datetime
import functools
import jwt

# pylint: disable=import-error
from flask import Flask,jsonify,request,abort

"""
A simple app to create a JWT token.
"""

JWT_SECRET = os.environ.get(''JWT_SECRET'',''myjwtsecret'')
LOG_LEVEL = os.environ.get(''LOG_LEVEL'',''DEBUG'')

def _logger():
    ''''''
    Setup logger format,level,and handler.
    RETURNS: log object
    ''''''
    formatter = logging.Formatter(''%(asctime)s - %(name)s - %(levelname)s - %(message)s'')

    log = logging.getLogger(__name__)
    log.setLevel(LOG_LEVEL)

    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)

    log.addHandler(stream_handler)
    return log


LOG = _logger()
LOG.debug("Starting with log level: %s" % LOG_LEVEL )
APP = Flask(__name__)

def require_jwt(function):
    """
    Decorator to check valid jwt is present.
    """
    @functools.wraps(function)
    def decorated_function(*args,**kws):
        if not ''Authorization'' in request.headers:
            abort(401)
        data = request.headers[''Authorization'']
        token = str.replace(str(data),''Bearer '','''')
        try:
            jwt.decode(token,JWT_SECRET,algorithms=[''HS256''])
        except: # pylint: disable=bare-except
            abort(401)

        return function(*args,**kws)
    return decorated_function


@APP.route(''/'',methods=[''POST'',''GET''])
def health():
    return jsonify("Healthy")


@APP.route(''/auth'',methods=[''POST''])
def auth():
    """
    Create JWT token based on email.
    """
    request_data = request.get_json()
    if request_data is None:
        print("request returned None")
    else:
        print("doing somethings")
    email = request_data.get(''email'')
    password = request_data.get(''password'')
    if not email:
        LOG.error("No email provided")
        return jsonify({"message": "Missing parameter: email"},400)
    if not password:
        LOG.error("No password provided")
        return jsonify({"message": "Missing parameter: password"},400)
    body = {''email'': email,''password'': password}

    user_data = body

    #return jsonify(token=_get_jwt(user_data).decode(''utf-8''))
    return jsonify(token=_get_jwt(user_data))
    


@APP.route(''/contents'',methods=[''GET''])
def decode_jwt():
    """
    Check user token and return non-secret data
    """
    if not ''Authorization'' in request.headers:
        abort(401)
    data = request.headers[''Authorization'']
    token = str.replace(str(data),'''')
    try:
        data = jwt.decode(token,algorithms=[''HS256''])
    except: # pylint: disable=bare-except
        abort(401)


    response = {''email'': data[''email''],''exp'': data[''exp''],''nbf'': data[''nbf''] }
    return jsonify(**response)


def _get_jwt(user_data):
    exp_time = datetime.datetime.utcNow() + datetime.timedelta(weeks=2)
    payload = {''exp'': exp_time,''nbf'': datetime.datetime.utcNow(),''email'': user_data[''email'']}
    return jwt.encode(payload,algorithm=''HS256'')

if __name__ == ''__main__'':
    APP.run(host=''127.0.0.1'',port=8080,debug=True)

在 Docker 容器下执行:

Docker 镜像是通过以下方式创建的:

docker build --tag jwt-api-test .

并执行:

docker run -p 80:8080 --env-file=.env_file jwt-api-test

.env_file:

JWT_SECRET=''myjwtsecret''
LOG_LEVEL=DEBUG

所以当我用 Postman 测试时:

本地主机:80/auth

带身体:

{
"Email": "test@test.com","Password": "pass"
}

和标题:

application/json

它返回给我错误:

500 内部服务器错误

并且在终端窗口中,或者它被执行了 Docker 容器,我可以阅读:

  File "/app/main.py",line 84,in auth
    email = request_data.get(''email'')
AttributeError: ''nonetype'' object has no attribute ''get''

当我在第二个终端中测试以下 CURL 命令时:

export TOKEN=`curl --data ''{"email":"test@test.com","password":"pass"}'' --header "Content-Type: application/json" -X POST localhost:80/auth  | jq -r ''.token''`

我收到错误:

连接被拒绝

我不知道是python代码错误还是与Docker容器的IP不同还是其他错误?

我需要你的帮助。

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

beautifulsoup 标签元素内容() strip() 方法抛出 TypeError: Nonetype 不可调用

beautifulsoup 标签元素内容() strip() 方法抛出 TypeError: Nonetype 不可调用

选择 pyplot.hist() 标签,然后使用 a

获取以前的内容
.previous_sibling

com.fasterxml.jackson.annotation.JsonSubTypes.Type的实例源码

com.fasterxml.jackson.annotation.JsonSubTypes.Type的实例源码

项目:org.ops4j.ramler    文件:PojoGeneratingApiVisitor.java   
private void addJsonTypeInfo(JDefinedClass klass,ObjectTypeDeclaration type) {
    if (!context.getConfig().isJacksonTypeInfo()) {
        return;
    }
    if (type.discriminator() == null) {
        return;
    }
    List<String> derivedTypes = context.getApiModel().findDerivedTypes(type.name());
    if (derivedTypes.isEmpty()) {
        return;
    }
    JAnnotationUse typeInfo = klass.annotate(JsonTypeInfo.class);
    typeInfo.param("use",Id.NAME);
    typeInfo.param("include",As.EXISTING_PROPERTY);
    typeInfo.param("property",type.discriminator());

    JAnnotationUse subTypes = klass.annotate(JsonSubTypes.class);
    JAnnotationArrayMember typeArray = subTypes.paramArray(VALUE);

    for (String derivedType : derivedTypes) {
        JDefinedClass subtype = pkg._getClass(derivedType);
        typeArray.annotate(Type.class).param(VALUE,subtype);
    }
}
项目:GitHub    文件:CustomBuilderDeserialize.java   
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
    @Type(name = "I",value = Integer.class),@Type(name = "O",value = Double.class)
})
// the annotation will be copied to a builder setter
public abstract @Nullable Object value();
项目:QuizUpWinner    文件:JacksonAnnotationIntrospector.java   
public List<NamedType> findSubtypes(Annotated paramAnnotated)
{
  JsonSubTypes localJsonSubTypes = (JsonSubTypes)paramAnnotated.getAnnotation(JsonSubTypes.class);
  if (localJsonSubTypes == null)
    return null;
  JsonSubTypes.Type[] arrayOfType = localJsonSubTypes.value();
  ArrayList localArrayList = new ArrayList(arrayOfType.length);
  int i = arrayOfType.length;
  for (int j = 0; j < i; j++)
  {
    JsonSubTypes.Type localType = arrayOfType[j];
    localArrayList.add(new NamedType(localType.value(),localType.name()));
  }
  return localArrayList;
}
项目:javersion    文件:JacksonMappingResolver.java   
@Nonnull
@Override
public Result<Map<TypeDescriptor,String>> subclasses(TypeDescriptor type) {
    JsonSubTypes jsonSubType = type.getAnnotation(JsonSubTypes.class);
    if (jsonSubType != null && jsonSubType.value().length > 0) {
        TypeDescriptors typeDescriptors = type.getTypeDescriptors();
        Map<TypeDescriptor,String> aliasesByTypes = asList(jsonSubType.value()).stream()
                .collect(toMap(subType -> typeDescriptors.get(subType.value()),Type::name));
        return Result.of(aliasesByTypes);
    }
    return Result.notFound();
}
项目:immutables    文件:CustomBuilderDeserialize.java   
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
    @Type(name = "I",value = Double.class)
})
// the annotation will be copied to a builder setter
public abstract @Nullable Object value();

我们今天的关于struts2整合json出现no result type defined for type ''json''的解决方法struts2 json result类型的分享就到这里,谢谢您的阅读,如果想了解更多关于Ajax.Utility.RegisterTypeForAjax(typeof(_Default)) 的使用、AttributeError: 'NoneType' 对象在 request_json、beautifulsoup 标签元素内容() strip() 方法抛出 TypeError: Nonetype 不可调用、com.fasterxml.jackson.annotation.JsonSubTypes.Type的实例源码的相关信息,可以在本站进行搜索。

本文标签: