2015-10-04 3 views
3

Я хочу, чтобы произвести json от JPA @Entity, у меня естьискаженной JSON: Неожиданное '<' весной

@Entity 
@JsonAutoDetect 
public class Bar implements Serializable {  
    @Id 
    @GeneratedValue 
    private Integer id; 
    private String title; 
    //omitting other stuff 
} 

мой контроллер

@RestController 
public class BarController { 

    @Autowired 
    private BarService barService; 

    @RequestMapping(value = "/", method = RequestMethod.GET, headers = "Accept=application/json", produces={"application/json"}) 

    public List<Bar> list() {    
     return barService.findAllBars()); 
    } 

} 

У меня эта ошибка в браузере

HTTP 406

и в почтальоне Postman Malformed JSON

что с этим связано.

+0

Вы сериализуете свой список в JSON, прежде чем возвращать его? – legendofawesomeness

+0

Я не знаю, как вы настраиваете Spring, но это часто означает, что у вас нет установленных JSON-преобразователей. Я использую Spring Boot, что делает это для меня. – chrylis

+1

@chrylis Spring Boot не выбор тогда ??? –

ответ

1

Я поймал одну фатальную ошибку, которая вы получаете список баров barService.findAllBars(), возможно, потребуется преобразовать этот список JSON добавив метод как

public static String toJSON(Object object) 
    { 
     if (object == null){ 
     return "{}"; 
     } 
     try { 
      ObjectMapper mapper = new ObjectMapper(); 
      return mapper.writeValueAsString(object); 
      } 
     catch (Exception e) { 
     e.printStackTrace(); 
     } 
     return "{}"; 
     } 

Теперь внести изменения как

@RequestMapping(value = "/", method = RequestMethod.GET, produces={"application/json"}) 
    public String list() { 
     return toJSON(barService.findAllBars()); 
    } 

надеюсь, что это сработает, если возникнут какие-либо проблемы, вы можете запросить в сеансе комментариев.

+2

У Spring есть встроенная поддержка для обработки этого преобразования более гибким и надежным способом. – chrylis

+0

Это помогло, но когда у меня есть некоторые __join__ и есть поле типа '@ManyToMany (каскадные = {CascadeType.MERGE}) \t @JoinTable (имя = "foos_bars", \t joinColumns = @JoinColumn (имя = "foos_id"), \t inverseJoinColumns = @JoinColumn (имя = "bars_id")) \t частный Список Foos; 'я получаю> org.codehaus.jackson.map.JsonMappingException: не удалось инициализировать лениво коллекцию роли: pkj.Bar. foos, не может инициализировать прокси - нет сеанса (через цепочку ссылок: java.util.ArrayList [0] -> pkj.entity.Bar ["foos"]), как решить эту проблему –

+0

@chrylis любой пример, пожалуйста, в этом случае ?? –

1

Я подозреваю, что есть что-то неладное с вашим заголовком принятия в вашем запросе на получение. Попробуйте установить заголовок на

"Accept=*/*" 

и посмотреть, что вы вернетесь.

5

Сообщение «Malformed JSON» получено из печати «Pretty». Нажмите «Raw», чтобы увидеть фактический ответ.

Фактический ответ - это ошибка 406 Not Acceptable (говорит так на вашем экране) с полезной нагрузкой HTML (отсюда неожиданно < от «Довольно»), в котором говорится, что запрос был отклонен сервером.

Снимите headers = "Accept=application/json" с @RequestMapping. produces={"application/json"} уже говорит Spring, чтобы вызвать этот метод только в том случае, если application/json является приемлемым ответом, который, вероятно, есть, но заголовок может сказать *.* или что-то более сложное, как text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, оба из которых позволят application/json.

Конечно, так как это, скорее всего, вызов AJAX, что ожидает JSON, он должен перечислили только application/json в значении accept. Проверьте код, выполняющий вызов AJAX, если это не так.

0

Используйте JsonFormatter https://jsonformatter.curiousconcept.com/, чтобы проверить JSON, прежде чем продолжить. Это очень хороший инструмент, который проверяет JSON и показывает возможные ошибки с номером строки.

Смежные вопросы