У меня была одна и та же проблема, но для меня это не помогло, но это помогло мне как с JPA, так и с MongoDb, чтобы сохранить кого-то еще, потратив на это время. Мало того, что это работает с валидацией, но я получаю приятную ошибку 400, а не по умолчанию 500.
Пришлось добавить это в мои зависимости build.gradle
compile('org.hibernate:hibernate-validator:4.2.0.Final')
и это config class
@Configuration
public class CustomRepositoryRestConfigurerAdapter extends RepositoryRestConfigurerAdapter {
@Bean
public Validator validator() {
return new LocalValidatorFactoryBean();
}
@Override
public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
validatingListener.addValidator("afterCreate", validator());
validatingListener.addValidator("beforeCreate", validator());
validatingListener.addValidator("afterSave", validator());
validatingListener.addValidator("beforeSave", validator());
}
}
Нет, не обязательно - хотя это зависит от вашего определения терминов, и нет очень четких и широко принятых определений.
Например, языки динамического программирования часто безопасны по типу, но не строго типизированы. Другими словами, во время компиляции нет информации о типе, определяющей, что вы можете и чего не можете делать с типом, но во время выполнения среда выполнения следит за тем, чтобы вы не использовали один тип, как если бы он был другим.
Например, в C # 4.0 вы можете:
dynamic foo = "hello";
dynamic length = foo.Length; // Uses String.Length at execution time
foo = new int[] { 10, 20, 30 };
length = foo.Length; // Uses Array.Length at execution time
dynamic bar = (FileStream) foo; // Fails!
Последняя строка является ключом к безопасности типов: нет безопасного преобразования из массива int в FileStream
, поэтому операция завершается неудачно - вместо обработка байтов объекта массива так, как если бы они были FileStream
.
РЕДАКТИРОВАТЬ: C # обычно является "строго типизированным" (как язык) и безопасным типом: компилятор не позволит вам выполнять произвольные вызовы объекта, а среда выполнения не позволит вам выполнять несоответствующие преобразования.
Я не совсем уверен, где подходит небезопасный код - я недостаточно знаю о это для комментариев, я боюсь.
Динамическая типизация в C # 4 позволяет использовать слабо типизированный, но все же типобезопасный код, как показано выше.
Обратите внимание, что foreach
выполняет неявное преобразование, что делает его своего рода гибрид:
ArrayList list = new ArrayList();
list.Add("foo");
foreach (FileStream stream in list)
{
...
}
Это будет компилироваться (недавно был еще один вопрос ), но завершится ошибкой во время выполнения. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.
t позволяет вам делать произвольные вызовы объекта, и среда выполнения не позволит вам выполнять несоответствующие преобразования.Я не совсем уверен, где подходит небезопасный код - я не знаю достаточно об этом, чтобы комментировать, Боюсь.
Динамическая типизация в C # 4 позволяет использовать слабо типизированный, но все же типобезопасный код, как показано выше.
Обратите внимание, что foreach
выполняет неявное преобразование, что делает его своего рода гибридом. :
ArrayList list = new ArrayList();
list.Add("foo");
foreach (FileStream stream in list)
{
...
}
Это будет компилироваться (недавно был еще один вопрос ), но во время выполнения произойдет сбой. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.
t позволяет вам делать произвольные вызовы объекта, и среда выполнения не позволит вам выполнять несоответствующие преобразования.Я не совсем уверен, где подходит небезопасный код - я не знаю достаточно об этом, чтобы комментировать, Боюсь.
Динамическая типизация в C # 4 позволяет использовать слабо типизированный, но все же типобезопасный код, как показано выше.
Обратите внимание, что foreach
выполняет неявное преобразование, что делает его своего рода гибридом. :
ArrayList list = new ArrayList();
list.Add("foo");
foreach (FileStream stream in list)
{
...
}
Это будет компилироваться (недавно был еще один вопрос ), но во время выполнения произойдет сбой. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.
m не совсем уверен, где подходит небезопасный код - боюсь, я недостаточно знаю об этом, чтобы комментировать.Динамическая типизация в C # 4 позволяет использовать слабо типизированный, но все же типобезопасный код, как показано выше.
Обратите внимание, что foreach
выполняет неявное преобразование, что делает его своего рода гибридом:
ArrayList list = new ArrayList();
list.Add("foo");
foreach (FileStream stream in list)
{
...
}
Он будет компилироваться (недавно был еще один вопрос ), но во время выполнения произойдет сбой. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.
m не совсем уверен, где подходит небезопасный код - боюсь, я недостаточно знаю об этом, чтобы комментировать.Динамическая типизация в C # 4 позволяет использовать слабо типизированный, но все же типобезопасный код, как показано выше.
Обратите внимание, что foreach
выполняет неявное преобразование, что делает его своего рода гибридом:
ArrayList list = new ArrayList();
list.Add("foo");
foreach (FileStream stream in list)
{
...
}
Он будет компилироваться (недавно был еще один вопрос ), но во время выполнения произойдет сбой. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.
Обратите внимание, что foreach
выполняет неявное преобразование, что делает его своего рода гибридом:
ArrayList list = new ArrayList();
list.Add("foo");
foreach (FileStream stream in list)
{
...
}
Он будет компилироваться (недавно был еще один вопрос по этому поводу), но не выполнится. время. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.
Обратите внимание, что foreach
выполняет неявное преобразование, что делает его своего рода гибридом:
ArrayList list = new ArrayList();
list.Add("foo");
foreach (FileStream stream in list)
{
...
}
Он будет компилироваться (недавно был еще один вопрос по этому поводу), но не выполнится. время. По иронии судьбы, это потому, что вы пытаетесь строго типизировать по отношению к переменной потока , что означает, что вы должны выполнить приведение к результату итератора.
Хороший вопрос. Прочтите эту запись в Википедии, вот выдержка:
Бенджамин С. Пирс, автор книги «Типы» и языки программирования и Advanced Типы и языки программирования, говорит: "Я потратил несколько недель ... пытаясь отсортировать вне терминологии "сильно типизированный, "" статически типизированный "," безопасный " и т. д., и нашел это удивительно сложно .... Использование этих терминов настолько разнообразен, что делает их почти бесполезно. "
«Тип безопасен» означает, что здесь не задействовано приведение типов и не могут возникнуть ошибки типа времени выполнения.
Некоторые люди утверждают, что «строго типизированный»
Они в основном одинаковы, это просто вопрос интерпретации:
Из википедии:
Типовая безопасность является синонимом одного из многих определения строгой типизации; но безопасность типов и динамическая типизация взаимно совместимы. Язык с динамической типизацией, такой как Smalltalk, можно рассматривать как строго типизированный язык с очень разрешающей системой типов, где любая синтаксически правильная программа хорошо типизирована; до тех пор, пока его динамическая семантика гарантирует, что ни одна такая программа никогда не «пойдет не так» в надлежащем смысле, она удовлетворяет приведенному выше определению и может быть названа типобезопасной.