From 5a3c03a8de07a2c41288e575333f10f3d5a29ea4 Mon Sep 17 00:00:00 2001 From: stamen Date: Wed, 26 Mar 2014 21:34:32 +0800 Subject: [PATCH] modify the JacksonJsonRopMarshaller make null property not serialize to message --- .../SampleAfterDoServiceEventListener.java | 8 ++-- .../SamplePreDoServiceEventListener.java | 8 ++-- .../main/java/com/rop/sample/UserService.java | 4 +- .../sample/response/CreateUserResponse.java | 33 +++++++++++++++++ .../com/rop/sample/UserServiceRawClient.java | 3 +- rop/changelog.txt | 7 ++++ rop/pom.xml | 37 +++++++++---------- .../java/com/rop/RequestContextBuilder.java | 2 +- .../main/java/com/rop/RopRequestContext.java | 15 +------- .../java/com/rop/ServiceMethodAdapter.java | 4 +- .../impl/AnnotationServiceMethodAdapter.java | 8 ++-- .../impl/AnnotationServletServiceRouter.java | 20 +++++----- .../impl/ServletRequestContextBuilder.java | 4 +- .../com/rop/impl/SimpleRopRequestContext.java | 22 ++++------- .../marshaller/JacksonJsonRopMarshaller.java | 7 +++- .../marshaller/MessageMarshallerUtils.java | 5 +-- 16 files changed, 109 insertions(+), 78 deletions(-) diff --git a/rop-sample/src/main/java/com/rop/sample/SampleAfterDoServiceEventListener.java b/rop-sample/src/main/java/com/rop/sample/SampleAfterDoServiceEventListener.java index 895465a..dac5e45 100644 --- a/rop-sample/src/main/java/com/rop/sample/SampleAfterDoServiceEventListener.java +++ b/rop-sample/src/main/java/com/rop/sample/SampleAfterDoServiceEventListener.java @@ -10,6 +10,8 @@ import com.rop.event.RopEventListener; import com.rop.marshaller.MessageMarshallerUtils; +import java.util.Map; + /** *
  * 功能说明:
@@ -23,9 +25,9 @@ public class SampleAfterDoServiceEventListener implements RopEventListener allParams = ropRequestContext.getAllParams();
+            String message = MessageMarshallerUtils.asUrlString(allParams);
             System.out.println("message("+ropEvent.getServiceEndTime()+")"+message);
         }
     }
diff --git a/rop-sample/src/main/java/com/rop/sample/SamplePreDoServiceEventListener.java b/rop-sample/src/main/java/com/rop/sample/SamplePreDoServiceEventListener.java
index 7c71b98..2ffa66b 100644
--- a/rop-sample/src/main/java/com/rop/sample/SamplePreDoServiceEventListener.java
+++ b/rop-sample/src/main/java/com/rop/sample/SamplePreDoServiceEventListener.java
@@ -10,6 +10,8 @@
 import com.rop.event.RopEventListener;
 import com.rop.marshaller.MessageMarshallerUtils;
 
+import java.util.Map;
+
 /**
  * 
  * 功能说明:
@@ -23,9 +25,9 @@ public class SamplePreDoServiceEventListener implements RopEventListener allParams = ropRequestContext.getAllParams();
+            String message = MessageMarshallerUtils.getMessage(allParams, ropRequestContext.getMessageFormat());
             System.out.println("message("+ropEvent.getServiceBeginTime()+")"+message);
         }
     }
diff --git a/rop-sample/src/main/java/com/rop/sample/UserService.java b/rop-sample/src/main/java/com/rop/sample/UserService.java
index b397cd5..ec9c488 100644
--- a/rop-sample/src/main/java/com/rop/sample/UserService.java
+++ b/rop-sample/src/main/java/com/rop/sample/UserService.java
@@ -244,8 +244,8 @@ public Object userList(RopRequest ropRequest) throws Throwable {
 
     @ServiceMethod(method = "img.get", version = "1.0",
             httpAction = HttpAction.GET,
-            ignoreSign = IgnoreSignType.YES,
-            needInSession = NeedInSessionType.NO)
+    ignoreSign = IgnoreSignType.YES,
+    needInSession = NeedInSessionType.NO)
     public void getImg(RopRequest ropRequest) throws Throwable {
         HttpServletResponse response = (HttpServletResponse)
                 ropRequest.getRopRequestContext().getRawResponseObject();
diff --git a/rop-sample/src/main/java/com/rop/sample/response/CreateUserResponse.java b/rop-sample/src/main/java/com/rop/sample/response/CreateUserResponse.java
index afd4b25..d665ff6 100644
--- a/rop-sample/src/main/java/com/rop/sample/response/CreateUserResponse.java
+++ b/rop-sample/src/main/java/com/rop/sample/response/CreateUserResponse.java
@@ -36,6 +36,15 @@ public class CreateUserResponse{
     @XmlElement
     private String feedback;
 
+    @XmlAttribute
+    private Boolean status = true;
+
+    @XmlAttribute
+    private Integer age = 10;
+
+    @XmlAttribute
+    private Float height = 170.01f;
+
     @XmlElement
     private List fooList;
 
@@ -53,6 +62,30 @@ public void setFooList(List fooList) {
         this.fooList = fooList;
     }
 
+    public Boolean getStatus() {
+        return status;
+    }
+
+    public void setStatus(Boolean status) {
+        this.status = status;
+    }
+
+    public Integer getAge() {
+        return age;
+    }
+
+    public void setAge(Integer age) {
+        this.age = age;
+    }
+
+    public Float getHeight() {
+        return height;
+    }
+
+    public void setHeight(Float height) {
+        this.height = height;
+    }
+
     public String getUserId() {
         return userId;
     }
diff --git a/rop-sample/src/test/java/com/rop/sample/UserServiceRawClient.java b/rop-sample/src/test/java/com/rop/sample/UserServiceRawClient.java
index 204ba3a..408d024 100644
--- a/rop-sample/src/test/java/com/rop/sample/UserServiceRawClient.java
+++ b/rop-sample/src/test/java/com/rop/sample/UserServiceRawClient.java
@@ -31,12 +31,13 @@
 public class UserServiceRawClient {
 
     public static final String SERVER_URL = "http://localhost:8088/router";
+
     private String sessionId;
 
     /**
      * 创建一个服务端的会话
      */
-    @BeforeMethod
+//    @BeforeMethod
     public void createSession() {
         RestTemplate restTemplate = new RestTemplate();
         MultiValueMap form = new LinkedMultiValueMap();
diff --git a/rop/changelog.txt b/rop/changelog.txt
index f41d5bf..91e7deb 100644
--- a/rop/changelog.txt
+++ b/rop/changelog.txt
@@ -117,6 +117,13 @@ http://yourhost?method=rop.user.add&v=1.0&callback=myfun,则响应报文的
  图片获取等;
 2.重构了pom.xml的结构.
 
+1.0.2-SNAPSHOT (2014-03-24)
+1.ServiceMethodAdapter的方法 :Object invokeServiceMethod(RopRequestContext ropRequestContext)变更为:
+Object invokeServiceMethod(RopRequest ropRequest); 
+2.ReopRequestContext删除getRopRequest及setRopRequest的方法;
+3.SimpleRopRequestContext添加session属性,在创建RopRequestContext时获取设置session;
+4.解决会话更新后不能自动同步到会话管理器的BUG.
+
 
 
 
diff --git a/rop/pom.xml b/rop/pom.xml
index fcc6a07..c57f129 100644
--- a/rop/pom.xml
+++ b/rop/pom.xml
@@ -183,25 +183,24 @@
                     
                 
             
-            
-                org.apache.maven.plugins
-                maven-javadoc-plugin
-                2.7
-                
-                    ${file.encoding}
-                    ${file.encoding}
-                    ${file.encoding}
-                    
-                
-                
-                    
-                        attach-javadocs
-                        
-                            jar
-                        
-                    
-                
-            
+            
+                
+                
+                
+                
+                    
+                    
+                    
+                
+                
+                    
+                        
+                        
+                            
+                        
+                    
+                
+            
 
             
                 org.apache.maven.plugins
diff --git a/rop/src/main/java/com/rop/RequestContextBuilder.java b/rop/src/main/java/com/rop/RequestContextBuilder.java
index d943284..a249402 100644
--- a/rop/src/main/java/com/rop/RequestContextBuilder.java
+++ b/rop/src/main/java/com/rop/RequestContextBuilder.java
@@ -27,6 +27,6 @@ public interface RequestContextBuilder {
      *
      * @param ropRequestContext
      */
-    void bindBusinessParams(RopRequestContext ropRequestContext);
+    RopRequest buildRopRequest(RopRequestContext ropRequestContext);
 }
 
diff --git a/rop/src/main/java/com/rop/RopRequestContext.java b/rop/src/main/java/com/rop/RopRequestContext.java
index 75acf46..e897d89 100644
--- a/rop/src/main/java/com/rop/RopRequestContext.java
+++ b/rop/src/main/java/com/rop/RopRequestContext.java
@@ -144,7 +144,7 @@ public interface RopRequestContext {
     /**
      * 设置服务开始时间
      *
-     * @param serviceBeginTime
+     * @param serviceEndTime
      */
     void setServiceEndTime(long serviceEndTime);
 
@@ -182,19 +182,6 @@ public interface RopRequestContext {
      */
     Object getRopResponse();
 
-    /**
-     * 设置{@link RopRequest}
-     *
-     * @param ropRequest
-     */
-    void setRopRequest(RopRequest ropRequest);
-
-    /**
-     * 请求对象
-     *
-     * @return
-     */
-    RopRequest getRopRequest();
 
     /**
      * 获取特定属性
diff --git a/rop/src/main/java/com/rop/ServiceMethodAdapter.java b/rop/src/main/java/com/rop/ServiceMethodAdapter.java
index 52c5724..674aa05 100644
--- a/rop/src/main/java/com/rop/ServiceMethodAdapter.java
+++ b/rop/src/main/java/com/rop/ServiceMethodAdapter.java
@@ -16,10 +16,10 @@ public interface ServiceMethodAdapter {
     /**
      * 调用服务方法
      *
-     * @param ropRequestContext
+     * @param ropRequest
      * @return
      */
-    Object invokeServiceMethod(RopRequestContext ropRequestContext);
+    Object invokeServiceMethod(RopRequest ropRequest);
 
 }
 
diff --git a/rop/src/main/java/com/rop/impl/AnnotationServiceMethodAdapter.java b/rop/src/main/java/com/rop/impl/AnnotationServiceMethodAdapter.java
index d1de177..9d95494 100644
--- a/rop/src/main/java/com/rop/impl/AnnotationServiceMethodAdapter.java
+++ b/rop/src/main/java/com/rop/impl/AnnotationServiceMethodAdapter.java
@@ -3,6 +3,7 @@
  */
 package com.rop.impl;
 
+import com.rop.RopRequest;
 import com.rop.RopRequestContext;
 import com.rop.ServiceMethodAdapter;
 import com.rop.ServiceMethodHandler;
@@ -31,11 +32,12 @@ public class AnnotationServiceMethodAdapter implements ServiceMethodAdapter {
     /**
      * 调用ROP服务方法
      *
-     * @param ropRequestContext
+     * @param ropRequest
      * @return
      */
-    public Object invokeServiceMethod(RopRequestContext ropRequestContext) {
+    public Object invokeServiceMethod(RopRequest ropRequest) {
         try {
+            RopRequestContext ropRequestContext = ropRequest.getRopRequestContext();
             //分析上下文中的错误
             ServiceMethodHandler serviceMethodHandler = ropRequestContext.getServiceMethodHandler();
             if (logger.isDebugEnabled()) {
@@ -44,7 +46,7 @@ public Object invokeServiceMethod(RopRequestContext ropRequestContext) {
             }
             if (serviceMethodHandler.isHandlerMethodWithParameter()) {
                 return serviceMethodHandler.getHandlerMethod().invoke(
-                        serviceMethodHandler.getHandler(), ropRequestContext.getRopRequest());
+                        serviceMethodHandler.getHandler(),ropRequest);
             } else {
                 return serviceMethodHandler.getHandlerMethod().invoke(serviceMethodHandler.getHandler());
             }
diff --git a/rop/src/main/java/com/rop/impl/AnnotationServletServiceRouter.java b/rop/src/main/java/com/rop/impl/AnnotationServletServiceRouter.java
index 2f48b3a..68fd1ca 100644
--- a/rop/src/main/java/com/rop/impl/AnnotationServletServiceRouter.java
+++ b/rop/src/main/java/com/rop/impl/AnnotationServletServiceRouter.java
@@ -375,7 +375,7 @@ public void run() {
             }
 
             RopRequestContext ropRequestContext = null;
-
+            RopRequest ropRequest = null;
             try {
                 //用系统级参数构造一个RequestContext实例(第一阶段绑定)
                 ropRequestContext = requestContextBuilder.buildBySysParams(
@@ -388,7 +388,7 @@ public void run() {
                 } else {
 
                     //绑定业务数据(第二阶段绑定)
-                    requestContextBuilder.bindBusinessParams(ropRequestContext);
+                    ropRequest = requestContextBuilder.buildRopRequest(ropRequestContext);
 
                     //进行其它检查业务数据合法性,业务安全等
                     mainError = securityManager.validateOther(ropRequestContext);
@@ -402,10 +402,10 @@ public void run() {
 
                         if (ropRequestContext.getRopResponse() == null) { //拦截器未生成response
                             //如果拦截器没有产生ropResponse时才调用服务方法
-                            ropRequestContext.setRopResponse(doService(ropRequestContext));
+                            ropRequestContext.setRopResponse(doService(ropRequest));
 
                             //输出响应前拦截
-                            invokeBeforceResponseOfInterceptors(ropRequestContext);
+                            invokeBeforceResponseOfInterceptors(ropRequest);
                         }
                     }
                 }
@@ -418,7 +418,7 @@ public void run() {
                     ServiceUnavailableErrorResponse ropResponse = new ServiceUnavailableErrorResponse(method, locale, e);
 
                     //输出响应前拦截
-                    invokeBeforceResponseOfInterceptors(ropRequestContext);
+                    invokeBeforceResponseOfInterceptors(ropRequest);
                     writeResponse(ropResponse, servletResponse, ropRequestContext.getMessageFormat(),jsonpCallback);
                 }else{
                     throw new RopException("RopRequestContext is null.", e);
@@ -534,9 +534,10 @@ private void invokeBeforceServiceOfInterceptors(RopRequestContext ropRequestCont
     /**
      * 在服务调用之后,返回响应之前拦截
      *
-     * @param ropRequestContext
+     * @param ropRequest
      */
-    private void invokeBeforceResponseOfInterceptors(RopRequestContext ropRequestContext) {
+    private void invokeBeforceResponseOfInterceptors(RopRequest ropRequest) {
+        RopRequestContext ropRequestContext = ropRequest.getRopRequestContext();
         Interceptor tempInterceptor = null;
         try {
             if (interceptors != null && interceptors.size() > 0) {
@@ -593,15 +594,16 @@ private void writeResponse(Object ropResponse, HttpServletResponse httpServletRe
         }
     }
 
-    private Object doService(RopRequestContext ropRequestContext) {
+    private Object doService(RopRequest ropRequest) {
         Object ropResponse = null;
+        RopRequestContext ropRequestContext = ropRequest.getRopRequestContext();
         if (ropRequestContext.getMethod() == null) {
             ropResponse = new ErrorResponse(MainErrors.getError(MainErrorType.MISSING_METHOD, ropRequestContext.getLocale()));
         } else if (!ropContext.isValidMethod(ropRequestContext.getMethod())) {
             ropResponse = new ErrorResponse(MainErrors.getError(MainErrorType.INVALID_METHOD, ropRequestContext.getLocale()));
         } else {
             try {
-                ropResponse = serviceMethodAdapter.invokeServiceMethod(ropRequestContext);
+                ropResponse = serviceMethodAdapter.invokeServiceMethod(ropRequest);
             } catch (Exception e) { //出错则招聘服务不可用的异常
                 if (logger.isInfoEnabled()) {
                     logger.info("调用" + ropRequestContext.getMethod() + "时发生异常,异常信息为:" + e.getMessage());
diff --git a/rop/src/main/java/com/rop/impl/ServletRequestContextBuilder.java b/rop/src/main/java/com/rop/impl/ServletRequestContextBuilder.java
index 8eedae9..9259858 100644
--- a/rop/src/main/java/com/rop/impl/ServletRequestContextBuilder.java
+++ b/rop/src/main/java/com/rop/impl/ServletRequestContextBuilder.java
@@ -120,7 +120,7 @@ private String getRemoteAddr(HttpServletRequest request) {
      * @param ropRequestContext
      */
     @Override
-    public void bindBusinessParams(RopRequestContext ropRequestContext) {
+    public RopRequest buildRopRequest(RopRequestContext ropRequestContext) {
         AbstractRopRequest ropRequest = null;
         if (ropRequestContext.getServiceMethodHandler().isRopRequestImplType()) {
             HttpServletRequest request =
@@ -134,7 +134,7 @@ public void bindBusinessParams(RopRequestContext ropRequestContext) {
             ropRequest = new DefaultRopRequest();
         }
         ropRequest.setRopRequestContext(ropRequestContext);
-        ropRequestContext.setRopRequest(ropRequest);
+        return ropRequest;
     }
 
 
diff --git a/rop/src/main/java/com/rop/impl/SimpleRopRequestContext.java b/rop/src/main/java/com/rop/impl/SimpleRopRequestContext.java
index 9587312..91ea587 100644
--- a/rop/src/main/java/com/rop/impl/SimpleRopRequestContext.java
+++ b/rop/src/main/java/com/rop/impl/SimpleRopRequestContext.java
@@ -66,6 +66,8 @@ public class SimpleRopRequestContext implements RopRequestContext {
 
     private String requestId = RopUtils.getUUID();
 
+    private Session session;
+
     @Override
     public long getServiceBeginTime() {
         return this.serviceBeginTime;
@@ -149,15 +151,17 @@ public String getSessionId() {
 
     @Override
     public Session getSession() {
-        if (ropContext != null && ropContext.getSessionManager() != null && getSessionId() != null) {
-            return ropContext.getSessionManager().getSession(getSessionId());
-        } else {
-            return null;
+        if (session == null && ropContext != null &&
+                ropContext.getSessionManager() != null && getSessionId() != null) {
+           session = ropContext.getSessionManager().getSession(getSessionId());
         }
+        return session;
     }
 
     @Override
     public void addSession(String sessionId, Session session) {
+        this.sessionId = sessionId;
+        this.session = session;
         if (ropContext != null && ropContext.getSessionManager() != null) {
             ropContext.getSessionManager().addSession(sessionId, session);
         }
@@ -189,16 +193,6 @@ public Object getRopResponse() {
         return this.ropResponse;
     }
 
-    @Override
-    public RopRequest getRopRequest() {
-        return this.ropRequest;
-    }
-
-    @Override
-    public void setRopRequest(RopRequest ropRequest) {
-        this.ropRequest = ropRequest;
-    }
-
     public String getAppKey() {
         return this.appKey;
     }
diff --git a/rop/src/main/java/com/rop/marshaller/JacksonJsonRopMarshaller.java b/rop/src/main/java/com/rop/marshaller/JacksonJsonRopMarshaller.java
index b95772d..618c3e2 100644
--- a/rop/src/main/java/com/rop/marshaller/JacksonJsonRopMarshaller.java
+++ b/rop/src/main/java/com/rop/marshaller/JacksonJsonRopMarshaller.java
@@ -11,6 +11,7 @@
 import org.codehaus.jackson.map.AnnotationIntrospector;
 import org.codehaus.jackson.map.ObjectMapper;
 import org.codehaus.jackson.map.SerializationConfig;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
 
 import java.io.IOException;
@@ -43,8 +44,10 @@ private ObjectMapper getObjectMapper() throws IOException {
             AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
             SerializationConfig serializationConfig = objectMapper.getSerializationConfig();
             serializationConfig = serializationConfig.without(SerializationConfig.Feature.WRAP_ROOT_VALUE)
-                                                     .with(SerializationConfig.Feature.INDENT_OUTPUT)
-                                                     .withAnnotationIntrospector(introspector);
+                    .with(SerializationConfig.Feature.INDENT_OUTPUT)
+                    .withSerializationInclusion(JsonSerialize.Inclusion.NON_NULL)
+                    .withSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY)
+                    .withAnnotationIntrospector(introspector);
             objectMapper.setSerializationConfig(serializationConfig);
             this.objectMapper = objectMapper;
         }
diff --git a/rop/src/main/java/com/rop/marshaller/MessageMarshallerUtils.java b/rop/src/main/java/com/rop/marshaller/MessageMarshallerUtils.java
index 16fb0e6..f78dc92 100644
--- a/rop/src/main/java/com/rop/marshaller/MessageMarshallerUtils.java
+++ b/rop/src/main/java/com/rop/marshaller/MessageMarshallerUtils.java
@@ -84,11 +84,10 @@ public static String getMessage(RopRequest request, MessageFormat format) {
     /**
      * 将请求对象转换为String
      *
-     * @param request
+     * @param allParams
      * @return
      */
-    public static String asUrlString(RopRequest request) {
-        Map allParams = request.getRopRequestContext().getAllParams();
+    public static String asUrlString(Map allParams) {
         StringBuilder sb = new StringBuilder(256);
         boolean first = true;
         for (Map.Entry entry : allParams.entrySet()) {