SpringMVC+Hibernate+Spring使用websevice报错

编写客户端运行报错误如下:

AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
 faultActor: 
 faultNode: 
 faultDetail: 
	{http://xml.apache.org/axis/}hostname:SDWM-20151009RB

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
	at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
	at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
	at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2973)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:648)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:332)
	at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
	at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
	at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
	at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
	at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
	at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
	at org.apache.axis.client.Call.invoke(Call.java:2767)
	at org.apache.axis.client.Call.invoke(Call.java:2443)
	at org.apache.axis.client.Call.invoke(Call.java:2366)
	at org.apache.axis.client.Call.invoke(Call.java:1812)
	at ws.TestCancleOrder.main(TestCancleOrder.java:77)

检查发现这是因为我的websevice中如下使用了事务,当发生异常的时候会回滚报错,使得我try catch中设置的返回信息无法正常返回。

@Component("tripService")
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public class TripService implements ITripService {
	.......
	/**
	 * 查询航班
	 * @param SearchXFlightRequest
	 * @return SearchXFlightResult
	 */
	@Override
	public SearchXFlightResult searchXFlight(SearchXFlightRequest dto) {
		SearchXFlightResult searchXFlightResult = new SearchXFlightResult();
		if(dto == null){
			searchXFlightResult.setSuccess(false);
			searchXFlightResult.setErrorInfo("输入参数不能为空!");
			return searchXFlightResult;
		}
		DTOSearchFlight dtoSearchFlight = new DTOSearchFlight();
		BeanUtils.copyProperties(dto, dtoSearchFlight);
		DTOFlightResult dtoFlightResult = flightService.searchFlight(dtoSearchFlight);
		if(dtoFlightResult == null){
			searchXFlightResult.setErrorInfo("查询接口异常!");
			searchXFlightResult.setSuccess(false);
			return searchXFlightResult;
		}
		if(!dtoFlightResult.isSuccess()){
			searchXFlightResult.setErrorInfo(dtoFlightResult.getErrorMsg());
			searchXFlightResult.setSuccess(false);
			return searchXFlightResult;
		}
		try {
			//复制
			searchXFlightResult = SearchXFlightResultMapper.getInstance().mapToValue(dtoFlightResult);
			searchXFlightResult.setSuccess(true);
		} catch (Exception e) {
			searchXFlightResult.setSuccess(false);
			searchXFlightResult.setErrorInfo(e.toString());
		}
	
		return searchXFlightResult;
	}
}

解决方法:将事务管理去掉,即@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) 删除即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值