sen*_*iwu 14 java json hibernate jackson spring-boot
我正在尝试使用Spring boot/Spring RestController后端从AngularJS前端POST到http:// localhost:9095/translators.
我可以做一个GET,响应如下:
[{"userId":1,"firstName":"John","lastName":"Doe","emailId":"john.doe@inc.com","languages":[{"languageId":1,"languageCode":"gb","source":true}],"translations":[{"translationId":3,"sourceId":1,"sourceText":"Hello","targetId":null,"targetText":null,"translationStatus":"DUE"}],"userType":"TRANSLATOR"}
当我发布下面的json时,我得到错误响应
发布数据:
{
                    firstName: "zen",
                    lastName: "cv",
                    emailId: "email",
                    userType: "TRANSLATOR",
                    languages : [{languageId:1,languageCode:"gb",source:true}]
}
错误:
{
timestamp: 1422389312497
status: 415
error: "Unsupported Media Type"
exception: "org.springframework.web.HttpMediaTypeNotSupportedException"
message: "Content type 'application/json' not supported"
path: "/translators"
}
我确保我的控制器具有正确的Mediatype注释.
@RestController
@RequestMapping("/translators")
public class TranslatorController {
    @Autowired
    private UserRepository repository;
    @RequestMapping(method = RequestMethod.GET)
    public List findUsers() {
        return repository.findAll();
    }
    @RequestMapping(value = "/{userId}", method = RequestMethod.GET)
    public User findUser(@PathVariable Long userId) {
        return repository.findOne(userId);
    }
    @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public User addTranslator(@RequestBody User user) {
        //translation.setTranslationId(null);
        return repository.saveAndFlush(user);
    }
    @RequestMapping(value = "/{translatorId}", method = RequestMethod.PUT)
    public User updateTranslation(@RequestBody User updatedUser, @PathVariable Long userId) {
        //updatedTranslation.setTranslationId(translationId);
        return repository.saveAndFlush(updatedUser);
    }
    @RequestMapping(value = "/{translatorId}", method = RequestMethod.DELETE)
    public void deleteTranslation(@PathVariable Long translationId) {
        repository.delete(translationId);
    }
}
经过一些研究,并通过查看日志输出,我意识到这是一个误导性的错误消息,实际上问题是在序列化/反序列化Json时发生
在日志文件中,我发现
2015-01-27 21:08:32.488 WARN 15152 --- [nio-9095-exec-1] .cjMappingJackson2HttpMessageConverter:无法评估类型[simple type,class User]的反序列化:java.lang.IllegalArgumentException:无法处理托管/后向引用'defaultReference':与托管类型(User)不兼容的后引用类型(java.util.List)
这是我的类用户和类翻译(为了简洁省略了getter,setter,constructor等)
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name = "user_id")
    private long userId;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "email_id")
    private String emailId;
    @ManyToMany
    @JoinTable(name = "languages_users", joinColumns = { @JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "lang_id")})
    @JsonManagedReference
    private List<Language> languages = new ArrayList<Language>();
    @OneToMany(mappedBy = "translator", fetch = FetchType.EAGER)
    @JsonManagedReference
    private List<Translation> translations;
    @Enumerated(EnumType.STRING)
    private UserType userType;
}
@Entity
@Table(name = "translations")
public class Translation {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "translation_id")
    private Long translationId;
    @Column(name = "source_lang_id")
    private Long sourceId;
    @Column(name = "source_text")
    private String sourceText;
    @Column(name = "target_lang_id")
    private Long targetId;
    @Column(name = "target_text")
    private String targetText;
    @Enumerated(EnumType.STRING)
    @Column(name = "status")
    private TranslationStatus translationStatus;
    @ManyToOne
    @JoinColumn(name = "translator_id")
    @JsonBackReference
    private User translator;
}
我的问题是:如何为上述实体正确设置JsonManagedReference和JsonBackReference?我确实读过这份文件.我根据错误信息无法弄清楚这里有什么问题
小智 10
对于那些要求,另一种方法是使用fasterxml的JsonIdentityInfo并使用以下方法注释您的类:
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Account implements java.io.Serializable {
....
private Long id;
}
*没有足够的代表评论.
我通过摆脱JsonManagedReference和JsonBackReference并用JsonIdentityInfo替换它来解决它
| 归档时间: | 
 | 
| 查看次数: | 23430 次 | 
| 最近记录: |