如果您想了解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类型)
- 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 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)) 的使用
原文 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?
我有一个 Python 应用程序:
main.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 不可调用
选择 pyplot.hist()
标签,然后使用 a
.previous_sibling
com.fasterxml.jackson.annotation.JsonSubTypes.Type的实例源码
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); } }
@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();
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; }
@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(); }
@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的实例源码的相关信息,可以在本站进行搜索。
本文标签: