java.lang.ClassCastException: org.apache.shiro.web.servlet.ShiroHttpServletRequest cannot be cast to

本文记录了一个文件上传过程中遇到的问题及解决方法。问题出现在使用jQuery Validate进行验证时导致无法正常上传文件,通过调整为直接使用form表单提交解决了该问题,并详细展示了修改后的代码示例。

今天在做上传的时候,遇到一个这亲的问题。如题目。

以为是配置文件这与错了。结果查看了好长时间,没找一以错。程序里也没有问题。

最后,问题出在了jquery validate 验证这里。只好改成在form里提交。

如下:

<form id="importYuanLiaoFileForm" name="importYuanLiaoFileForm" action="${ctx}/xxxxx/getUpLoadFile.do" method="post" enctype ="multipart/form-data" target="hidden_frame">
       	<div class="ui-widget">
       		<div id="importYuanLiaoFile_toolbar" class="ui-widget-header ui-state-default"> 
				<button id="importYuanLiaoFileSaveBtn" type="button">确定</button>
				<button id="importYuanLiaoFileCloseBtn"  type="button">关闭</button>
	       	</div>
			<div id="importYuanLiaoFileErrorMsg" class="errorCls"></div>
			<fieldset>
				<legend>导入</legend>
			    <table cellspacing="5" cellpadding="5" border="0">
			    	<tr>
			    		<td>添加Excel文件</td>
			    		<td>
			    			<input type="file" id="importFile" name="importFile"/><font color="red">*</font>
			    		</td>
			    	</tr>
			    </table>
			</fieldset>
		</div>
	</form>
	<iframe name='hidden_frame' id="hidden_frame" style="display:none"></iframe>



@RequestMapping("getUpLoadFile")
	@SuppressWarnings({"unchecked","rawtypes"})
	public void getUpLoadFile(HttpServletRequest request, HttpServletResponse response) throws IOException{
		
		MultipartHttpServletRequest multipartRequest =  (MultipartHttpServletRequest) request;  
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();      
        String ctxPath=request.getSession().getServletContext().getRealPath("/")+"fileUpload"; //文件上传存储路径 
        ctxPath +=  File.separator;    
        // 创建文件夹    
        File file = new File(ctxPath);      
        if (!file.exists()) {      
        file.mkdirs();      
        }  
        String fileName = null;   
        String newName = null;  
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {      
	        // 上传文件     
	        MultipartFile mf = entity.getValue();    
	        fileName = mf.getOriginalFilename();//获取原文件名  
	        //获得当前时间的最小精度  
	        SimpleDateFormat format =  new SimpleDateFormat("yyyyMMddHHmmssSSS");  
	        newName = format.format(new Date());  
	        //获得三位随机数  
	        Random random = new Random();  
	        for(int i = 0; i < 3; i++){  
	            newName = newName + random.nextInt(9);  
	        }  
	        File uploadFile = new File(ctxPath + newName+fileName.substring(fileName.lastIndexOf(".")));  
	       try {    
	        FileCopyUtils.copy(mf.getBytes(), uploadFile);   
	       } catch (IOException e){  
	             e.printStackTrace();    
	       }  
       }  
        response.setHeader("Content-type", "text/html;charset=UTF-8");  
        response.setCharacterEncoding("UTF-8");  
       // response.getWriter().write(newName+fileName.substring(fileName.lastIndexOf("."))); 
        //处理上传数据
        try {
        	
        	String importFile = ctxPath + newName+fileName.substring(fileName.lastIndexOf("."));
        	importFile = importFile.replaceAll("\\\\","/");
        				
        	response.getWriter().write("<script>parent.upLoadFinsh();</script>"); //这里设置是返回时的处理方法。直接在js写function upLoadFinsh(){}就行
		} catch (Exception e) {
			logger.error("保存失败", e);
		}
	}



当遇到 `java.lang.ClassCastException: java.lang.String cannot be cast to B` 异常时,表明程序试图将一个 `String` 类型的对象强制转换为类 `B` 类型的对象,而这两个类型在继承层次上并不兼容,从而导致类型转换失败。 ### 1. 确保对象的实际类型与目标类型兼容 在进行类型转换之前,应确保对象的实际类型是目标类型的实例。可以通过 `instanceof` 运算符进行检查,避免非法的类型转换。 ```java if (obj instanceof B) { B b = (B) obj; // 使用 b } else { // 处理类型不匹配的情况 } ``` ### 2. 检查数据来源并进行类型验证 如果对象是从外部来源(如配置文件、数据库、网络请求等)获取的,应确保在获取时其类型是预期的类型。例如,在从 `Map` 中获取数据时,应先验证其类型再进行转换。 ```java Object value = map.get("key"); if (value instanceof B) { B b = (B) value; } else { // 处理类型不匹配的情况 } ``` ### 3. 使用泛型避免类型转换 在使用集合类(如 `List`、`Map`)时,尽量使用泛型来指定集合中元素的类型,这样可以避免在获取元素时进行不必要的类型转换。 ```java Map<String, B> map = new HashMap<>(); B b = map.get("key"); // 无需强制转换 ``` ### 4. 自定义类型转换逻辑 如果确实需要将 `String` 转换为类 `B` 的实例,应提供自定义的转换逻辑,而不是直接进行强制类型转换。例如,可以定义一个构造函数或静态方法来解析字符串并创建类 `B` 的实例。 ```java public class B { private String value; public B(String value) { this.value = value; } public static B fromString(String str) { return new B(str); } } // 使用示例 String str = "example"; B b = B.fromString(str); ``` ### 5. 使用 `Optional` 避免空值引发的异常 在处理可能为 `null` 的对象时,可以使用 `Optional` 来避免 `NullPointerException`,同时也可以在 `Optional` 中结合 `instanceof` 进行类型检查。 ```java Optional.ofNullable(obj) .filter(o -> o instanceof B) .map(o -> (B) o) .ifPresent(b -> { // 使用 b }); ``` ### 6. 调试和日志记录 在调试过程中,可以通过打印对象的类信息来确认其实际类型,帮助定位问题。 ```java System.out.println("Object class: " + obj.getClass().getName()); ``` ### 7. 使用反射进行类型检查 在某些动态场景下,可以使用反射来检查对象的类型,并进行相应的处理。 ```java if (obj.getClass() == B.class) { B b = (B) obj; } ``` ### 8. 避免不必要的类型转换 在设计类和接口时,尽量避免不必要的类型转换。可以通过良好的设计模式(如工厂模式、策略模式等)来减少类型转换的需求。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值