Content type ‘application/json;charset=UTF-8‘ not supp...

此篇博客探讨了在Java中使用Jackson库时遇到的日期格式化问题,特别关注了'application/json'内容类型下遇到的'i'字符非法的问题,以及如何正确设置日期格式为'yyyy-MM-dd HH24:mm:ss'。

Content type 'application/json;charset=UTF-8' not supp...de   java.lang.IllegalArgumentException: Illegal pattern character 'i'  对象中的日期格式化出现了问题。

Content type 'application/json;charset=UTF-8' not supp...

注意这里的格式设置,必须设置成 mm 如果设置mi那么不能编译

 

@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH24:mm:ss")
<?php /** * 鸿宇多用户商城 在线客服聊天系统-前台 * ============================================================================ * 版权所有 2015-2018 鸿宇多用户商城科技有限公司,并保留所有权利。 * 网站地址: http://bbs.hongyuvip.com; * ---------------------------------------------------------------------------- * 仅供学习交流使用,如需商用请购买正版版权。鸿宇不承担任何法律责任。 * 踏踏实实做事,堂堂正正做人。 * ============================================================================ * $Author: 鸿宇多用户商城 $ * $Id: category.php 17217 2015-02-10 06:29:08Z 鸿宇多用户商城 $ */ define('IN_ECS', true); require ('includes/init.php'); require ('includes/lib_chat.php'); /* 载入语言文件 */ require_once (ROOT_PATH . 'languages/' . $_CFG['lang'] . '/user.php'); $action = isset($_REQUEST['act']) ? trim($_REQUEST['act']) : 'chat'; /* 检查用户是否已登录 */ if(empty($_SESSION['user_id']) && $action != 'act_login' && $action != 'check_login') { // $captcha = intval($_CFG['captcha']); // if(($captcha & CAPTCHA_LOGIN) && (! ($captcha & CAPTCHA_LOGIN_FAIL) || (($captcha & CAPTCHA_LOGIN_FAIL) && $_SESSION['login_fail'] > 2)) && gd_version() > 0) // { // $GLOBALS['smarty']->assign('enabled_captcha', 1); // $GLOBALS['smarty']->assign('rand', mt_rand()); // } // 如果未登录跳转到登录页面 /** $smarty->assign('lang', $_LANG); $smarty->assign('back_act', ''); $smarty->assign('action', 'login'); $smarty->display('chat_passport.dwt'); **/ show_message('您还未登录系统,请先登录!', array('登录', '返回上一页'), array('user.php?act=login', 'index.php'), 'info'); return; } //路由 $function_name = 'action_' . $action; if(function_exists($function_name)) { call_user_func($function_name); } else { exit('函数' . $function_name . '不存在'); } /** * 检查用户是否登录 */ function action_check_login() { $is_login = empty($_SESSION['user_id']) ? 'false' : 'true'; exit($is_login); } /** * 处理会员登录 */ function action_act_login () { $user_id = $_SESSION['user_id']; $smarty = get_smarty(); $ecs = get_ecs(); $db = get_database(); /* 处理会员的登录 */ $username = isset($_POST['username']) ? trim($_POST['username']) : ''; $password = isset($_POST['password']) ? trim($_POST['password']) : ''; $back_act = isset($_POST['back_act']) ? trim($_POST['back_act']) : ''; $captcha = intval($_CFG['captcha']); if(($captcha & CAPTCHA_LOGIN) && (! ($captcha & CAPTCHA_LOGIN_FAIL) || (($captcha & CAPTCHA_LOGIN_FAIL) && $_SESSION['login_fail'] > 2)) && gd_version() > 0) { if(empty($_POST['captcha'])) { $smarty->assign('lang', $_LANG); $smarty->assign('action', 'login'); $smarty->assign('error', $_LANG['invalid_captcha']); $smarty->display('chat_passport.dwt'); return; } /* 检查验证码 */ include_once ('includes/cls_captcha.php'); $validator = new captcha(); $validator->session_word = 'captcha_login'; if(! $validator->check_word($_POST['captcha'])) { $smarty->assign('lang', $_LANG); $smarty->assign('action', 'login'); $smarty->assign('error', $_LANG['invalid_captcha']); $smarty->display('chat_passport.dwt'); return; } } if(is_email($username)) { $sql = "select user_name from " . $ecs->table('users') . " where email='" . $username . "'"; $username_e = $db->getOne($sql); if($username_e) $username = $username_e; } if(is_telephone($username)) { $sql = "select user_name from " . $ecs->table('users') . " where mobile_phone='" . $username . "'"; $username_res = $db->query($sql); $kkk = 0; while($username_row = $db->fetchRow($username_res)) { $username_e = $username_row['user_name']; $kkk = $kkk + 1; } if($kkk > 1) { $smarty->assign('lang', $_LANG); $smarty->assign('action', 'login'); $smarty->assign('error', '本网站有多个会员ID绑定了和您相同的手机号,请使用其他登录方式,如:邮箱或用户名。'); $smarty->display('chat_passport.dwt'); return; } if($username_e) { $username = $username_e; } } if($GLOBALS['user']->login($username, $password, isset($_POST['remember']))) { update_user_info(); recalculate_price(); // 登录成功 $ucdata = isset($user->ucdata) ? $user->ucdata : ''; // show_message($_LANG['login_success'] . $ucdata , // array($_LANG['back_up_page'], $_LANG['profile_lnk']), // array($back_act,'user.php'), 'info'); // 刷新user_id $user_id = $_SESSION['user_id']; header('Location: chat.php?act=chat'); } else { $_SESSION['login_fail'] ++; $smarty->assign('lang', $_LANG); $smarty->assign('action', 'login'); $smarty->assign('error', $_LANG['login_failure']); $smarty->display('chat_passport.dwt'); return; } } /* ------------------------------------------------------ */ // -- 在线客服聊天 --> 请求聊天 // 聊天窗口右侧默认展示最近订单,如果想要展示商品、订单、店铺则需要在当前页面中设置隐藏域,name必须为 chat_goods_id, // chat_order_id, chat_supp_id /* ------------------------------------------------------ */ function action_chat () { $user_id = $_SESSION['user_id']; $smarty = get_smarty(); $ecs = get_ecs(); $db = get_database(); /** * 判断当前用户是为聊天系统的注册用户 */ $exist = check_of_username_exist($user_id); // 获取用户头像 if(! empty($user_id)) { $sql = "select password, headimg from " . $ecs->table('users') . " where user_id = '$user_id'"; $row = $db->getRow($sql); $headimg = $row['headimg']; $password = $row['password']; $smarty->assign('headimg', $headimg); } if(! $exist) { // 查询ECShop内用户信息 $sql = 'select a.user_id, a.password, a.email, a.user_name from ' . $ecs->table('users') . ' AS a where a.user_id = "' . $user_id . '"'; $user = $GLOBALS['db']->getRow($sql); if(empty($user)) { // 根据user_id未查找到任何用户信息 } // 用户不存在,创建用户信息 $username = $user_id; $password = $user['password']; $name = $user['user_name']; $email = $user['email']; $type = 10; $shop_id = - 1; // $result = create_of_user($username, $password, $name, $email, $type, $shop_id);(修改前)) $of_password = md5($password); $result = create_of_user($username, $of_password, $name, $email, $type, $shop_id); if($result) { // 创建成功 } else { // 创建失败 } } // 获取前端传来的商品编号、订单编号、店铺编号等 // 商品编号则显示商品信息 // 订单编号则显示订单信息 // 店铺编号则显示店铺信息 $goods_id = null; $supp_id = - 1; $order_id = null; $customers = null; // 获取客服信息 $tab_items = array(); // 客服类型 $cus_types = CUSTOMER_SERVICE; // 记录需要发给客服的URL if(! empty($_REQUEST['chat_goods_id'])) { /* 咨询商品信息 */ $goods_id = $_REQUEST['chat_goods_id']; $goods = goods_info($goods_id); $smarty->assign('chat_goods', $goods); $smarty->assign('chat_goods_id', $goods_id); $tab_items[] = array( "id" => "chat_goods","name" => "咨询商品" ); // 客服+售前 $cus_types = CUSTOMER_SERVICE . ',' . CUSTOMER_PRE; } if(! empty($_REQUEST['chat_order_id'])) { /* 咨询订单信息 */ require ('includes/lib_order.php'); $order_id = $_REQUEST['chat_order_id']; // 获取商品和店铺信息 $goods_id = null; $order = order_info($order_id); $supp_id = $order['supplier_id']; $order['order_status_text'] = $GLOBALS['_LANG']['os'][$order['order_status']] . ',' . $GLOBALS['_LANG']['ps'][$order['pay_status']] . ',' . $GLOBALS['_LANG']['ss'][$order['shipping_status']]; $order['goods_list'] = order_goods($order_id); $smarty->assign('chat_order', $order); $smarty->assign('chat_order_id', $order_id); $smarty->assign('chat_order_sn', $order['order_sn']); $tab_items[] = array( "id" => "chat_order","name" => "咨询订单" ); // 客服+售后 $cus_types = CUSTOMER_SERVICE . ',' . CUSTOMER_AFTER; } if(! empty($_REQUEST['chat_supp_id']) && $_REQUEST['chat_supp_id'] != 0) { /* 店铺信息 */ $supp_id = $_REQUEST['chat_supp_id']; $supp_info = get_dianpu_baseinfo($supp_id); $smarty->assign('supp_info', $supp_info); $smarty->assign('chat_supp_id', $supp_id); $tab_items[] = array( "id" => "chat_supp", "name" => "店铺信息" ); // 客服+售前 $cus_types = CUSTOMER_SERVICE . ',' . CUSTOMER_PRE; } if(true) { /* 最近订单列表 */ require ('includes/lib_transaction_1.php'); // 获取用户最近的5条订单列表 $order_list = get_user_orders_1($user_id, 5, 0); // 所有客服忙碌状态,提示web端 $smarty->assign('order_list', $order_list); $smarty->assign('order_count', count($order_list)); $tab_items[] = array( "id" => "chat_order_list","name" => "最近订单" ); // 客服 $cus_types = CUSTOMER_SERVICE; } // 获取客服信息 $customers = get_customers($cus_types, $supp_id); // 转换为JSON数据 $smarty->assign('tab_items', json_encode($tab_items)); $to = null; // 客服获取策略:0-顺序、1-随机、2-竞争 if(! empty($customers)) { // 暂时采用随机策略 $poliy = 1; if($poliy == 0) { foreach($customers as $customer) { $status = $customer['status']; if($status == '在线' || $status == '空闲') { $to = $customer; break; // if(isset($customer['cus_status']) && count($customers) > 1) // { // if(time() - $customer['chat_time'] > 5*60) // { // set_customer_status($customer['cus_id'], 0); // $customer['cus_status'] = 0; // } // if($customer['cus_status'] == 0) // { // $to = $customer; // break; // } // } // else // { // $to = $customer; // break; // } } } } else if($poliy == 1) { /* 随进策略 */ $onlines = array(); foreach($customers as $customer) { $status = $customer['status']; if($status == '在线' || $status == '空闲') { $onlines[] = $customer; } } if(count($onlines) > 0) { $min = 1; $max = count($onlines); $i = mt_rand($min, $max); $to = $onlines[$i - 1]; } } else { } if(empty($to)) { if($supp_id == -1){ // 所有客服忙碌状态,提示web端 $smarty->assign('system_notice', '当前客服忙碌,请稍后联系!'); }else{ // 所有客服忙碌状态,提示web端 $smarty->assign('system_notice', '当前店铺客服忙碌,请稍后联系!'); } } else { $xmpp_domain = get_xmpp_domain(); $_SESSION['OF_FROM'] = $user_id . '@' . $xmpp_domain; $_SESSION['OF_TO'] = $to['of_username'] . '@' . $xmpp_domain; $smarty->assign('from', $_SESSION['OF_FROM']); $smarty->assign('password', $password); // $smarty->assign('password', "123456"); // $smarty->assign('to', '==to=='); // 传递正确的客服JID给前端 $smarty->assign('to', $_SESSION['OF_TO']); $smarty->assign('username', $_SESSION['user_name']); $smarty->assign('customername', $to['cus_name']); // 存储在Session中方便其他地方使用 // 所有客服忙碌状态,提示web端 $smarty->assign('system_notice', '客服<span class="kf_name">' . $to['cus_name'] . '</span>已加入会话!'); } } else { // 所有客服忙碌状态,提示web端 $smarty->assign('system_notice', '当前客服忙碌,请稍后联系!'); } // 打开聊天页面 $smarty->display('chat.dwt'); } /* ------------------------------------------------------ */ // -- 在线客服聊天 --> 认证失败,重新设置聊天系统的用户密码 // 聊天窗口右侧默认展示最近订单,如果想要展示商品、订单、店铺则需要在当前页面中设置隐藏域,name必须为 chat_goods_id, // chat_order_id, chat_supp_id /* ------------------------------------------------------ */ function action_authfail () { $user_id = $_SESSION['user_id']; $sql = "select user_name, password, email from " . $GLOBALS['ecs']->table('users') . " where user_id = '$user_id'"; $row = $db->getRow($sql); $success = create_of_user($user_id, $row['password'], $row['user_name'], $row['email'], 10, - 1); if($success) { $result = array( 'error' => 1,'message' => '可能由于网络原因,发生错误!请点击 <a href="chat.php?act=chat"><strong>重试</strong></a> ,重新连接...','content' => '' ); } else { $result = array( 'error' => 1,'message' => '由于网络原因,发生错误!请点击 <a href="chat.php?act=chat"><strong>重试</strong></a> ,重新连接...','content' => '' ); } $result = json_encode($result); exit($result); } /** * 用户离线 */ function action_off_line() { // 用户超过5分钟未发言则视为自动离线,更新客服状态 } function is_telephone ($phone) { $chars = "/^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$/"; if(preg_match($chars, $phone)) { return true; } } /** * 获取db对象 * * @return unknown */ function get_database () { return $GLOBALS['db']; } /** * 获取smarty对象 * * @return unknown */ function get_smarty () { return $GLOBALS[smarty]; } /** * 获取ecs对象 * * @return unknown */ function get_ecs () { return $GLOBALS['ecs']; } /* * 获取商品所对应店铺的店铺基本信息 * @param int $suppid 店铺id * @param int $suppinfo 入驻商的信息 */ function get_dianpu_baseinfo ($suppid = 0) { if(intval($suppid) <= 0) { return; } $sql_supplier = "SELECT s.supplier_id,s.supplier_name,s.add_time,sr.rank_name FROM " . $GLOBALS['ecs']->table("supplier") . " as s left join " . $GLOBALS['ecs']->table("supplier_rank") . " as sr ON s.rank_id=sr.rank_id WHERE s.supplier_id=" . $suppid . " AND s.status=1"; $supp_info = $GLOBALS['db']->getRow($sql_supplier); $sql = "SELECT * FROM " . $GLOBALS['ecs']->table('supplier_shop_config') . " WHERE supplier_id = " . $suppid; $shopinfo = $GLOBALS['db']->getAll($sql); $config = array(); foreach($shopinfo as $value) { $config[$value['code']] = $value['value']; } $shop_info = array(); $shop_info['ghs_css_path'] = 'themes/' . $config['template'] . '/images/ghs/css/ghs_style.css'; // 入驻商所选模板样式路径 $shoplogo = empty($config['shop_logo']) ? 'themes/' . $config['template'] . '/images/dianpu.jpg' : $config['shop_logo']; $shop_info['shoplogo'] = $shoplogo; // 商家logo $shop_info['shopname'] = htmlspecialchars($config['shop_name']); // 店铺名称 $shop_info['suppid'] = $suppid; // 商家名称 $shop_info['suppliername'] = htmlspecialchars($supp_info['supplier_name']); // 商家名称 $shop_info['userrank'] = htmlspecialchars($supp_info['rank_name']); // 商家等级 $shop_info['region'] = get_province_city($config['shop_province'], $config['shop_city']); $shop_info['address'] = $config['shop_address']; $shop_info['serviceqq'] = $config['qq']; $shop_info['serviceww'] = $config['ww']; $shop_info['serviceemail'] = $config['service_email']; $shop_info['servicephone'] = $config['service_phone']; $shop_info['createtime'] = gmdate('Y-m-d', $config['add_time']); // 商家创建时间 $suppid = (intval($suppid) > 0) ? intval($suppid) : intval($_GET['suppId']); return $shop_info; function get_xmpp_domain() { return 'yfw.szrengjing.com'; // 替换为你的Openfire服务器域名 } } ?> 这个前台聊天 是如何运行的
最新发布
11-16
<think>嗯,用户提供的这个Valgrind错误信息看起来有点复杂,我先得仔细看看里面的内容。首先,错误信息显示的是“16 bytes in 1 blocks are possibly lost”,这说明可能存在内存泄漏的问题。用户可能是在运行程序时遇到了内存泄漏的警告,想了解这个问题的原因以及如何解决它。 首先,我需要回忆一下Valgrind的基本知识。Valgrind是一个用于检测内存问题的工具,比如内存泄漏、使用未初始化的内存、非法内存访问等等。常见的错误类型有“definitely lost”(肯定泄漏)、“indirectly lost”(间接泄漏)、“possibly lost”(可能泄漏)等。这里的“possibly lost”通常意味着程序中有指针指向已分配内存块的中间部分,而不是起始位置,这可能是因为内存覆盖或者某些指针运算导致的。这种情况下,Valgrind无法确定是否存在真正的泄漏,但需要开发者进一步检查。 接下来,错误信息中的调用堆栈显示内存分配是通过g_realloc函数进行的,这属于GLib库的函数。这说明问题可能出在使用GLib库的地方,特别是当进行内存重新分配时。调用堆栈中的函数涉及到g_type_register_fundamental,这可能是在注册GObject类型时发生的。GObject是GLib的类型系统,用于实现面向对象的编程。因此,可能是在初始化某个GObject类型时,内存分配没有正确释放。 用户可能需要知道的是,这类问题通常不是应用程序代码直接导致的,而可能是底层库的某些初始化过程。例如,GLib在程序启动时会进行一些全局的类型注册,这些操作可能会分配内存,而这些内存在程序结束时可能没有被显式释放,从而导致Valgrind报告“possibly lost”。这种情况有时候被认为是误报,因为这些内存在程序退出时会被操作系统回收,但严格来说,还是应该确保所有分配的内存都被正确释放。 接下来,我需要考虑用户可能的解决步骤。首先,检查自己的代码中是否正确管理了内存,特别是使用GLib函数如g_malloc、g_realloc后是否有对应的g_free。如果确认自己的代码没有问题,那么可能需要考虑是否是第三方库的问题。在这种情况下,可以尝试升级GLib和相关库到最新版本,看看问题是否已经修复。此外,Valgrind的一些错误可以通过抑制文件来忽略已知的问题,特别是当这些错误来自系统库且无法修改时。 另外,用户可能需要了解如何生成和使用Valgrind的抑制文件。例如,运行Valgrind时使用--gen-suppressions=all选项可以生成抑制规则,然后将这些规则添加到抑制文件中,后续运行Valgrind时通过--suppressions参数指定该文件,从而避免重复报告这些已知问题。 不过,用户需要谨慎处理这类错误,不能一概而论地忽略所有“possibly lost”错误。应该首先排除自身代码的问题,确认是否存在真正的内存泄漏。比如,是否在某个地方动态分配了内存但忘记释放,或者在错误处理路径中遗漏了释放内存的步骤。使用Valgrind的详细选项,如--leak-check=full,可以帮助定位具体的内存泄漏位置。 总结来说,用户需要分步骤进行排查:首先检查自己的代码,确认是否正确释放了所有分配的内存;其次,考虑是否是第三方库的问题,尝试更新库版本;最后,如果确定是库的问题且无法解决,可以使用Valgrind的抑制文件来忽略这些错误。同时,用户需要理解“possibly lost”的具体含义,并采取相应的措施来确保程序的内存安全性。</think>好的,这个 Valgrind 错误信息涉及内存管理问题,以下是逐步分析: --- ### **一、错误类型解读** 错误信息 `16 bytes in 1 blocks are possibly lost` 表示程序可能发生了**内存泄漏**。具体来说: - **"Possibly lost"** 表示 Valgrind 检测到指针指向已分配内存块的中间位置,而非起始地址(例如指针运算后未正确恢复),导致无法确定内存是否真的泄漏。 - **16 bytes** 是泄漏的内存大小,**1 block** 表示涉及一个内存块。 --- ### **二、调用栈分析** 关键调用栈信息: ```plaintext ==62002== at 0x48386DC: malloc (vg_replace_malloc.c:380) ==62002== by 0x483A88F: realloc (vg_replace_malloc.c:856) ==62002== by 0x5567E47: g_realloc (in GLib 的库文件) ==62002== by 0x54E4F38: ??? (GObject 类型系统相关代码) ==62002== by 0x54EA610: g_type_register_fundamental (注册 GObject 基础类型) ``` - **根源操作**:通过 `g_realloc` 重新分配内存(GLib 的内存管理函数)。 - **上下文**:发生在 GObject 类型系统初始化过程中(`g_type_register_fundamental`),可能是 GLib/GObject 内部类型注册时的内存操作。 --- ### **三、可能原因** 1. **库内部初始化问题**: - GLib/GObject 在程序启动时会注册基础类型(如 `G_TYPE_OBJECT`),这些操作可能**未完全释放初始化阶段分配的内存**。 - 此类问题常见于**全局初始化/反初始化不对称**的场景。 2. **应用程序代码问题**: - 若代码中直接操作了 GObject 类型系统(如动态注册类型未正确注销),可能导致此问题。 - 检查是否忘记调用 `g_type_free()` 或相关清理函数。 --- ### **四、解决方案** #### 步骤 1:检查应用程序代码 - 确保所有通过 `g_malloc`/`g_realloc` 分配的内存都有对应的 `g_free`。 - 若使用自定义 GObject 类型,确保注销逻辑正确(如 `g_type_free()`)。 #### 步骤 2:验证是否为库的已知问题 - GLib 某些版本可能存在内存管理缺陷,升级到最新版本并重试。 - 搜索 Valgrind 错误中的函数名(如 `g_type_register_fundamental`)+ "memory leak",确认是否为社区已知问题。 #### 步骤 3:抑制误报(若确认无害) 若确认泄漏来自库的内部初始化且不影响程序稳定性,可通过 Valgrind 抑制文件忽略: ```bash valgrind --suppressions=glib.supp ./your_program ``` 生成抑制文件的方法: ```bash valgrind --gen-suppressions=all ./your_program 2>&1 | tee valgrind.log ``` --- ### **五、附加建议** - 使用 `--leak-check=full` 参数获取更详细泄漏信息: ```bash valgrind --leak-check=full --track-origins=yes ./your_program ``` - 若问题仅出现在程序退出时,可优先关注**全局变量**或**静态初始化**相关的资源释放。 --- ### **总结** 此错误可能由 GLib/GObject 内部初始化逻辑或应用程序代码中未正确释放内存导致。建议优先排查自定义代码,再考虑库版本或抑制误报。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值