我想为资源的REST接口提供这样的方法
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void add(@Auth User user, @Valid Food food) {
//consume
}
Run Code Online (Sandbox Code Playgroud)
但是,这是不可能的,因为我得到一个错误,如:"严重:缺少方法public void com.restaurant.FoodResource.add(com.restaurant.User,com.restaurant.Food)的依赖关系在索引0处的参数:SEVERE:Missing方法public void com.restaurant.FoodResource.add(com.restaurant.User,com.restaurant.Food)的索引在索引1的参数SEVERE:Method,public void com.restaurant.FoodResource.add(com.restaurant.User, com.restaurant.Food),用资源的POST注释,类com.restaurant.FoodResource,不被认为是有效的资源方法.
我发现根据规范(3.3.2.1实体参数),不可能有两个没有注释某些注释的参数http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html
还有什么选择可以做这样的事情?我想到的是一个封装User和Food的对象,但这似乎不是一个很好的解决方案.
有没有其他更优雅的方式来做这样的事情?我可以将JSON Food表示作为@PathParam发送吗?
是否有com.google.common.base.Optional的Json Serializer/Deserializer?
开箱即用这似乎不适用于杰克逊,见下文:
package com.example;
import java.io.IOException;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import com.google.common.base.Optional;
public class TestClass {
public Optional<String> myString;
public TestClass() {
myString = Optional.of("testString");
}
public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
TestClass testClass = new TestClass();
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(testClass);
System.out.println(jsonString);
}
Run Code Online (Sandbox Code Playgroud)
}
- > {"myString":{"present":true}}