この質問が何億回も聞かれていることは知っていますが、基本的に PUT 要求からの JSON デシリアライズに要約される問題の解決策をまだ見つけることができません。
既に HiddenHttpMethodFilter をフィルターとして追加しています。
org.codehaus.jackson.jackson-mapper-lgpl はクラスパスにあります。
クライアント部分は次のとおりです。
$.ajax({
url: '/occurrence',
type: 'PUT',
contentType: 'application/json',
data: JSON.stringify({id:id,startDate:startDate, endDate:endDate, frequencyType:frequency})
})
コントローラー部分は次のとおりです。
@Controller
@RequestMapping("/occurrence")
public class OccurrenceController {
private static final String COMMAND = "eventCommand";
@Autowired
private PersistenceCapableOccurrence occurrenceDao;
@Autowired
private PersistenceCapableFrequencyType frequencyTypeDao;
@InitBinder(COMMAND)
public void customizeConversions(final WebDataBinder binder) {
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm");
df.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(df, true));
EntityConverter<FrequencyType> frequencyTypeEntityConverter = new EntityConverter<FrequencyType>(frequencyTypeDao, FrequencyType.class, "findByValue", String.class);
((GenericConversionService) binder.getConversionService()).addConverter(frequencyTypeEntityConverter);
}
@RequestMapping(method = PUT, consumes = "application/json")
@ResponseBody
public Long saveOccurrence(@RequestBody Occurrence occurrence) {
return occurrenceDao.saveOrUpdate(occurrence);
}
}
これが私の 2 つのドメイン クラス (Occurrence と FrequencyType) です。
public class Occurrence {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", nullable = false)
private long id;
@NotNull
@Column(name = "start_date")
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime startDate;
@Column(name="end_date")
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime endDate;
@ManyToOne
@JoinColumn(name = "frequency_type", nullable = false)
private FrequencyType frequencyType;
/* C-tor (1 with [start,end,freq], another with [start,freq]), getters (no setters) */
}
@Entity
@Table(name = "frequency_types")
public class FrequencyType {
public enum FrequencyTypeValues {
ONCE, DAILY, WEEKLY, MONTHLY, YEARLY;
}
private String value;
public FrequencyType() {}
public FrequencyType(FrequencyTypeValues value) {
this.value = value.name();
}
@Id
@Column(name = "value")
public String getValue() {
return value;
}
public void setValue(String value) {
//validates value against the enumerated/allowed values (ie throws exceptions if invalid value)
FrequencyTypeValues.valueOf(value.toUpperCase());
this.value = value;
}
}
最後に得られるのは 400 応答だけです。例 :
PUT Request
{"id":"","startDate":"20/10/2012 17:32","endDate":"","frequencyType":"YEARLY"}
Response
"NetworkError: 400 Bad Request - http://localhost:9999/occurrence"
よろしくお願いいたします。ロルフ