2015-10-28 8 views
0

Это мой первый вопрос, но я искал решение в течение 2 дней, без успеха. В моем проекте, у меня есть User сущность с переходным свойством:Spring-boot + Hibernate + JPA с переходными полями

@Transient 
@JsonProperty 
private List<String> files; 

У меня нет сеттера и геттер:

public List<String> getFiles() { 
    /* Call one static method */ 
} 

Выполнение приложения с NetBeans в отладке, работает отлично, и из javascript я могу получить результаты getFiles, используя user.fotos. Но когда я генерировать файл .jar, и я запустить приложение с помощью команды java -jar app.jar, путем вызова одной функции Rest, который должен возвращать один User объект, я получаю это исключение:

2015-10-28 14:39:35.963 WARN 27836 --- [nio-7777-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: (was java.lang.NullPointerException) (through reference chain: com.pfc.soriano.wsdbmodel.entity.User["files"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.pfc.soriano.wsdbmodel.entity.User["files"]) 
2015-10-28 14:39:35.963 WARN 27836 --- [nio-7777-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Handler execution resulted in exception: Could not write content: (was java.lang.NullPointerException) (through reference chain: com.pfc.soriano.wsdbmodel.entity.User["files"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.pfc.soriano.wsdbmodel.entity.User["files"]) 

Мой вопрос: Что Netbeans делает разные из командной строки java -jar, что заставляет его работать нормально?

+0

так что вы получаете NPE, а? только вы знаете, в какой строке какой код ... –

+0

Что вам нужно знать, Нейл? Из метода getFiles() я вызываю один статический метод: 'public static Collection getImages (префикс String, String path) { Список result = new ArrayList <>(); Файл Directorio = новый файл (путь); TruequeFiltro filtro = новый TruequeFiltro (префикс); for (Файл файла: directorio.listFiles (filtro)) { result.add (file.getName()); } результат возврата; } ' –

+0

У вас есть NPE, так что выработайте, какая строка, а затем выполните ЧИСЛО, а затем исправьте. –

ответ

1

Пытаясь найти некоторую документацию больше, я нашел это: JPA Transient Annotation and JSON

Благодаря Дамьена, наконец, у меня есть свой проект работает отлично: Главная Application.java:

@SpringBootApplication 
public class Application extends WebMvcConfigurerAdapter { 

    /* Here we register the Hibernate4Module into an ObjectMapper, then set this custom-configured ObjectMapper 
    * to the MessageConverter and return it to be added to the HttpMessageConverters of our application*/ 
    public MappingJackson2HttpMessageConverter jacksonMessageConverter() { 
     MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); 

     ObjectMapper mapper = new ObjectMapper(); 
     Hibernate4Module hm = new Hibernate4Module(); 
     hm.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION); 
     mapper.registerModule(hm); 

     messageConverter.setObjectMapper(mapper); 
     return messageConverter; 
    } 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(jacksonMessageConverter()); 
     super.configureMessageConverters(converters); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

объект пользователя Класс:

@Entity 
@Table(name = "user") 
public class User implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "ID") 
    private Long id; 
    @Transient 
    Collection<String> files; 

    public Long getId() { 
     files = Utils.getImages("" + id, "src/main/webapp/user/"); 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public Collection<String> getFiles() { 
     return files; 
    } 

    public void setFiles(Collection<String> files) { 
     this.files = files; 
    } 
} 

UserDAO интерфейс:

@RepositoryRestResource(collectionResourceRel = "users", itemResourceRel = "users") 
public interface UserDAO extends JpaRepository<User, Long> { 

} 

UserController:

@Controller 
@RequestMapping(value = "user") 
public class UserController { 

    @Autowired 
    UserDAO userDAO; 

    @RequestMapping(value = "findById", method = RequestMethod.POST) 
    @ResponseBody 
    public User findById(@Param("id") Long id) { 
     return userDAO.findOne(id); 
    } 
} 

функция JavaScript:

function loadUser(id) { 
    $.ajax({ 
     type: "POST", 
     url: serviceBaseUrl + "user/findById", 
     data: {id: id}, 
     contentType: "application/x-www-form-urlencoded; charset=UTF-8", 
     success: function (data, textStatus, jqXHR) { 
      if(data) { 
       alert(data.files); 
       /* DO SOMETHING ELSE */ 
      } 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      console.log(jqXHR.responseJSON.message); 
     } 
    }); 
} 

Результатом является то, что Javascript показать мне предупреждение с именами файлов, которые существуют на сервере.

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