コントローラーレベルでJavaオブジェクトを自動的に取得するために、Spring 3.0.5のHTTPメッセージコンバーターに従っています。シーケンシャルリクエストでは問題なく動作します。
しかし、サーバー上のRESTクライアントから同時リクエストを送信すると、Javaオブジェクトに矛盾が生じます.RESTクライアントを介してデータにいくつかの違いがある同じタイプのリクエストを送信しています.
一部の内部インスタンス オブジェクト値は、XML に存在する場合でも要求オブジェクトの null/空になりました。(フィルタ レベルおよびコントローラ レベルでのロギングにより検証済み)
オブジェクトのマップ (キーと値のペア) で常に矛盾が生じることに注意してください。この理由はわかりません。
以下の環境を使用しています。
- 春 3.0.5
- HTTP メッセージ コンバーター
- トムキャット 1.6
- jaxb 2.2
以下は、xml の構成です。
<bean id="messageAdapter"
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="marshallingHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter">
</bean>
コントローラのコードは次のとおりです。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;
import com.sfnt.saas.provisioning.service.ProvisioningInterfaceManager;
import com.sfnt.saas.provisioning.util.messages.ContractData;
import com.sfnt.saas.provisioning.util.messages.ContractInfo;
@Controller
public class ProvisioningController {
private final Log log = LogFactory.getLog(this.getClass());
@Autowired
private ProvisioningInterfaceManager provisioningInterfaceManager;
@RequestMapping(value = {"/1.0/Contract"}, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void deployContract(HttpServletRequest request,
HttpServletResponse response, @RequestBody ContractData contractData)
throws RuntimeException {
ContractInfo contractInfo = null;
contractInfo = provisioningInterfaceManager
.deployContract(contractData);
response.addHeader("Location", request.getRequestURL() + "/"
+ contractInfo.getContract().getContract());
}
}
助けてください !!!