一、返回类型为Map问题
cxf的restful实现已经实现返回类型为Map,不需要做任何的转换。
二、参数为Map问题
因为cxf不直接支持参数为Map情况,所以需要我们定义一个类型转换适配器
package com.winssage.base.module.frameworkimpl.security.util; import java.util.HashMap; import java.util.Map; import javax.xml.bind.annotation.adapters.XmlAdapter; /** * * 类型转换适配器类 * * @author limanman * */ public class MapAdapter extends XmlAdapter<MapConvertor, Map<String, Object>> { @Override public MapConvertor marshal(Map<String, Object> map) throws Exception { MapConvertor convertor = new MapConvertor(); for (Map.Entry<String, Object> entry : map.entrySet()) { MapConvertor.MapEntry e = new MapConvertor.MapEntry(entry); convertor.addEntry(e); } return convertor; } @Override public Map<String, Object> unmarshal(MapConvertor map) throws Exception { Map<String, Object> result = new HashMap<String, Object>(); for (MapConvertor.MapEntry e : map.getEntries()) { result.put(e.getKey(), e.getValue()); } return result; } }
package com.winssage.base.module.frameworkimpl.security.util; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; /** * Map格式转换类 * * @author limanman * */ @XmlRootElement @XmlType(name = "MapConvertor") @XmlAccessorType(XmlAccessType.FIELD) public class MapConvertor { private List<MapEntry> entries = new ArrayList<MapEntry>(); public void addEntry(MapEntry entry) { entries.add(entry); } public static class MapEntry { public MapEntry() { super(); } public MapEntry(Map.Entry<String, Object> entry) { super(); this.key = entry.getKey(); this.value = entry.getValue(); } public MapEntry(String key, Object value) { super(); this.key = key; this.value = value; } private String key; private Object value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } } public List<MapEntry> getEntries() { return entries; } }
三、例子
package com.winssage.winssagebpm.service; import java.util.Map; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import com.winssage.base.module.frameworkimpl.security.util.MapAdapter; @Path(value = "/jbpm") public interface BpmService { /** * 获取任务的变量定义 * * @param taskId 任务ID * * @return */ @POST @Path("/getVariablesByTaskId") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public Map<String, Object> getVariablesByTaskId(String taskId); @POST @Path("/map") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @XmlJavaTypeAdapter(MapAdapter.class) public Map<String, Object> testMap( @XmlJavaTypeAdapter(MapAdapter.class) Map<String, Object> map); }
package com.winssage.winssagebpm.serviceImpl; import java.util.HashMap; import java.util.Map; import javax.inject.Named; import org.apache.log4j.Logger; import org.springframework.transaction.annotation.Transactional; import com.winssage.winssagebpm.service.BpmService; @Named("bpmService") @Transactional public class BpmServiceImpl implements BpmService { private Logger log = Logger.getLogger(this.getClass()); @Override public Map<String, Object> getVariablesByTaskId(String taskId) { log.info("taskId: " + taskId); // Task task = this.taskService.getTask(taskId); // TaskImpl taskImpl = (TaskImpl) task; // Map<String, Object> variables = taskImpl.getVariables(); // return variables; Map<String, Object> variables = new HashMap<String, Object>(); variables.put("name", "fengshu"); return variables; } public Map<String, Object> testMap(Map<String, Object> map) { map.put("password", 123); return map; } }
时间: 2024-10-13 09:58:05